樹狀陣列【洛谷P2161】
阿新 • • 發佈:2018-11-21
傳送門:https://www.luogu.org/problemnew/show/P2161
不知道為啥O(n^2logn)竟然莽過了1e5的題...
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5+7; int psum[maxn],sump[maxn]; int n; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<='0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } struct node { char str; int l; int r; int id; }q[maxn]; struct newnode { int l; int r; int id; }; vector<newnode> v; inline void add(int p,int x) { for(register int i=p;i<maxn;i+=(i & -i)) { psum[i] += p*x; sump[i] += x; } } inline void add_range(int l,int r,int x) { add(l,x); add(r+1,-x); } inline int query(int p) { int ans = 0; for(register int i=p;i;i-=(i & -i)) { ans += (p+1)*sump[i]-psum[i]; } return ans; } inline int query_range(int l,int r) { return query(r)-query(l-1); } int main() { n = read(); int cnt = 0; for(register int i=1;i<=n;i++) { char op; int x,y; cin>>op; if(op=='A') { q[i].str = op; q[i].l = read(); q[i].r = read(); q[i].id = i; } else { q[i].str = op; q[i].id = i; } } for(register int i=1;i<=n;i++) { if(q[i].str=='A') { int ans = 0; if(query_range(q[i].l,q[i].r)==0) { add_range(q[i].l,q[i].r,q[i].id); v.push_back({q[i].l,q[i].r,q[i].id}); cnt++; } else { for(register int j=0;j<v.size();j++) { int tmpl = v[j].l; int tmpr = v[j].r; int tmpid = v[j].id; if((q[i].l>=tmpl && q[i].l<=tmpr) || (q[i].r>=tmpl && q[i].r<=tmpr) || (q[i].l<=tmpl && q[i].r>=tmpr) || (q[i].l>=tmpl && q[i].r<=tmpr)) { add_range(tmpl,tmpr,-tmpid); v.erase(v.begin()+j); j--; cnt--; ans++; } } add_range(q[i].l,q[i].r,q[i].id); v.push_back({q[i].l,q[i].r,q[i].id}); cnt++; } printf("%d\n",ans); } else { printf("%d\n",cnt); } } return 0; }