卧薪尝胆,厚积薄发。
JSOI2008 Blue Mary开公司
Date: Sat Nov 17 21:45:02 CST 2018 In Category: NoCategory

Description:

整体加入等差数列,单点询问最大值。
$1\leqslant n\leqslant 50000$

Solution:

李超线段树模板。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<cstring>
using namespace std;
#define N 50000
int n;
struct line
{
double k,b;
line(int x = 0,double y = 0.0,double k_ = 0.0)
{
k = k_;b = y - k * x;
return;
}
double f(int x)
{
return k * x + b;
}
};
struct node
{
int lc,rc;
line l;
}t[N << 1];
int ptr = 0;
int newnode(){return ++ptr;}
int root;
#define mid ((l + r) >> 1)
void build(int &rt,int l,int r)
{
rt = newnode();
if(l == r)return;
build(t[rt].lc,l,mid);
build(t[rt].rc,mid + 1,r);
return;
}
void add(int rt,line e,int l,int r)
{
if(t[rt].l.f(l) <= e.f(l) && t[rt].l.f(r) <= e.f(r))
{
t[rt].l = e;
return;
}
if(t[rt].l.f(l) >= e.f(l) && t[rt].l.f(r) >= e.f(r))return;
if(t[rt].l.f(mid) < e.f(mid))swap(t[rt].l,e);
if(t[rt].l.f(l) < e.f(l))
{
add(t[rt].lc,e,l,mid);
}
else
{
add(t[rt].rc,e,mid + 1,r);
}
return;
}
double query(int rt,int p,int l,int r)
{
if(l == r)return t[rt].l.f(l);
double res;
if(p <= mid)res = query(t[rt].lc,p,l,mid);
else res = query(t[rt].rc,p,mid + 1,r);
return max(res,t[rt].l.f(p));
}
int main()
{
scanf("%d",&n);
build(root,1,N);
int k;
double x,y;
char c[20];
for(int i = 1;i <= n;++i)
{
scanf("%s",c);
if(c[0] == 'Q')
{
scanf("%d",&k);
printf("%d\n",(int)(query(root,k,1,N) / 100));
}
else
{
scanf("%lf%lf",&x,&y);
add(root,line(1,x,y),1,N);
}
}
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡