10分求调
查看原帖
10分求调
442615
zhao2008楼主2024/7/19 21:48

rt。使用的是OIwiki上的写法,即线段树维护区间中点处最大线段的编号

#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=1e5+5,M=5e4;
const db inf=1e9;
int n,tot;
char opt[15];
struct segment{
	db a,b;
}seg[N];
db calc(int i,int x){
	if(i==0) return -inf;
	return seg[i].a+seg[i].b*(x-1);
}
struct SGT{
	#define ls (k<<1)
	#define rs (k<<1|1)
	struct node{
		int l,r,val;
	}t[M*4+5];
	void build(int k,int l,int r){
		t[k].l=l,t[k].r=r,t[k].val=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(ls,l,mid),build(rs,mid+1,r);
	}
	void insert(int k,int x){
		int mid=(t[k].l+t[k].r)>>1;
		if(calc(t[k].val,mid)<calc(x,mid)) swap(t[k].val,x);
		if(t[k].l==t[k].r) return;
		if(calc(t[k].val,t[k].l)<calc(x,t[k].l)) insert(ls,x);
		if(calc(t[k].val,t[k].r)<calc(x,t[k].r)) insert(ls,x);
	}
	db query(int k,int pos){
		int mid=(t[k].l+t[k].r)>>1;db res=calc(t[k].val,pos);
		if(t[k].l==t[k].r) return res;
		if(pos<=mid) res=max(res,query(ls,pos));
		else res=max(res,query(rs,pos));
		return res;
	}
	#undef ls
	#undef rs
}sgt;
int main(){
	scanf("%d",&n);
	int x;
	db a,b,ans;
	sgt.build(1,1,M);
	for(int i=1;i<=n;i++){
		scanf("%s",opt);
		if(opt[0]=='Q'){
			scanf("%d",&x);
			ans=sgt.query(1,x);
			if(ans<=0) printf("0\n");
			else printf("%d\n",int(ans/100));
		}
		else{
			scanf("%lf%lf",&a,&b);
			seg[++tot]=(segment){a,b};
			sgt.insert(1,tot);
		}
	}
	return 0;
}
2024/7/19 21:48
加载中...