Mn Zn WA = sb

P5482 [JLOI2011] 不等式组

```cpp #include <iostream> #include <cstdio> #include <algorithm> #include <cctype> #include <string> #include <cmath> #include <climits> using namespace std; typedef const long double cdb; typedef const int cint; cint MAXN=2e5+5; int n,tot,ans; struct data { int a,b,c; }p[MAXN]; bool visit[MAXN]; long double tmp[MAXN]; class WBLT { private: struct node { node *lson,*rson; long double val;int w; node(){} node(node* lson,node* rson,cdb val,cint w):lson(lson),rson(rson),val(val),w(w){} }*null,*root,tr[MAXN<<1],*pool[MAXN<<1]; cint ratio=4;int cnt; inline node* newnode(node* lson,node* rson,cdb val,cint w) { return &(*pool[cnt++]=node(lson,rson,val,w)); } inline node* merge(node* u,node *v) { return newnode(u,v,v->val,u->w+v->w); } inline void pushup(node* cur) { if(cur->lson==null || cur->rson==null) return; cur->val=cur->rson->val; cur->w=cur->lson->w+cur->rson->w; } inline void maintain(node* cur) { if(cur->lson==null || cur->rson==null) return; if(cur->lson->w>cur->rson->w*ratio) { cur->rson=merge(cur->lson->rson,cur->rson); pool[--cnt]=cur->lson; cur->lson=cur->lson->lson; } if(cur->rson->w>cur->lson->w*ratio) { cur->lson=merge(cur->lson,cur->rson->lson); pool[--cnt]=cur->rson; cur->rson=cur->rson->rson; } } void insert(node* cur,cdb val) { if(cur->w==1) { cur->lson=newnode(null,null,min(cur->val,val),1); cur->rson=newnode(null,null,max(cur->val,val),1); } else if(val<=cur->lson->val) insert(cur->lson,val); else insert(cur->rson,val); pushup(cur); maintain(cur); } void erase(node *cur,cdb val) { if(cur->lson->w==1 && cur->lson->val==val) { pool[--cnt]=cur->lson;pool[--cnt]=cur->rson; *cur=*cur->rson; } else if(cur->rson->w==1 && cur->rson->val==val) { pool[--cnt]=cur->rson;pool[--cnt]=cur->lson; *cur=*cur->lson; } else if(val<=cur->lson->val) erase(cur->lson,val); else erase(cur->rson,val); pushup(cur); maintain(cur); } int rank(node* cur,cdb val) { if(cur->w==1) return val>cur->val; if(val<=cur->lson->val) return rank(cur->lson,val); return cur->lson->w+rank(cur->rson,val); } public: void reset(void) { null=new node(nullptr,nullptr,0,0); root=new node(null,null,INT_MAX,1); for(int i=0;i<(MAXN<<1);i++) pool[i]=&tr[i]; } inline int size(void) {return root->w-1;} inline void insert(cdb val) {insert(root,val);} inline void erase(cdb val) {erase(root,val);} inline int rank(cdb val) {return size()==0?0:rank(root,val);} }t1,t2; int main() { t1.reset();t2.reset(); cin>>n; for(int i=1;i<=n;i++) { string s;cin>>s; if(s=="Add") { int a,b,c;cin>>a>>b>>c; p[++tot]=data{a,b,c};visit[tot]=true; if(a==0 && b>c) ans++; else if(a>0) t1.insert(tmp[tot]=(long double)(c-b)/(long double)(a)); else if(a<0) t2.insert(tmp[tot]=(long double)(c-b)/(long double)(a)); } if(s=="Del") { int x;cin>>x;cint a=p[x].a,b=p[x].b,c=p[x].c; if(!visit[x] || x>tot) continue; visit[x]=false; if(a==0 && b>c) ans--; else if(a>0) t1.erase(tmp[x]); else if(a<0) t2.erase(tmp[x]); } if(s=="Query") { int k;cin>>k; cout<<t1.rank(k)+ans+t2.size()-t2.rank(k)<<endl; } } return 0; } ```
by LemonLime @ 2020-11-23 21:26:53


~~这马蜂太毒了吧~~
by Priori_Incantatem @ 2020-12-14 11:43:46


|