萌新刚学OI两年半 李超线段树全WA求调
查看原帖
萌新刚学OI两年半 李超线段树全WA求调
375241
SunSkydp楼主2023/10/8 10:57

样例很水,调不出错误,代码学习的是李超线段树模版的第三篇题解。

#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;
}
2023/10/8 10:57
加载中...