样例很水,调不出错误,代码学习的是李超线段树模版的第三篇题解。
#include <bits/stdc++.h>
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int INF = 1e9 + 7;
const int N = 4e5 + 5;
const int yiyijiu = 1000000000;
const double eps = 1e-10;
struct line{
double k, b; int l, r;
double operator()(int x) {
if(l <= x && x <= r) return k * (x - 1) + b;
else return -INF;
}
}t[N];
template<typename T>
inline T read() {
T X = 0, w = 0; char ch = 0;
while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
return w ? -X : X;
}
struct LCTREE{
int id[N << 2];
void update(int rt, int l, int r, int x, int y, int v) {
if(x <= l && r <= y) {
if(!id[rt]) {id[rt] = v; return ;}
int mid = (l + r) >> 1;
if(t[v](mid) - t[id[rt]](mid) > eps) swap(v, id[rt]);
if(t[v](l)-t[id[rt]](l)>eps||(t[v](l)==t[id[rt]](l)&&v<id[rt])) update(rt<<1,l,mid,x,y,v);
if(t[v](r)-t[id[rt]](r)>eps||(t[v](r)==t[id[rt]](r)&&v<id[rt])) update(rt<<1|1,mid+1,r,x,y,v);
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) update(rt<<1,l,mid,x,y,v);
if(mid < y) update(rt<<1|1,mid+1,r,x,y,v);
}
double query(int rt, int l, int r, int x) {
if(l == r) return t[rt](x);
int mid = (l + r) >> 1;
if(x <= mid) return max(query(rt << 1, l, mid, x), t[rt](x));
else return max(query(rt << 1 | 1, mid + 1, r, x), t[rt](x));
}
}root;
int n, cnt;
int main() {
n = read<int>();
_for(i, 1, n) {
string op;
cin >> op;
if(op[0] == 'Q') {
int v;
cin >> v;
cout << (int)root.query(1, 1, 50005, v) / 100 << '\n';
} else {
double s, p;
cin >> s >> p;
++cnt;
t[cnt].k = p;
s -= p;
t[cnt].b = s;
t[cnt].l = 1;
t[cnt].r = 50005;
root.update(1, 1, 50005, 1, 50005, cnt);
}
}
return 0;
}