[CDQ分治 线性基] BZOJ 4184 shallot

来源:互联网 发布:淘宝二手图形工作站 编辑:程序博客网 时间:2024/05/16 16:13

代码应该都看得懂


#include<cstdio>#include<cstdlib>#include<algorithm>#include<map>#include<vector>#include<cstring>#define cl(x) memset(x,0,sizeof(x))using namespace std;typedef pair<int,int> abcd;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=500005;const int K=31;struct LB{int a[K+5];LB() { cl(a); }inline void insert(int x){for (int p=K;~p;p--)if (x>>p&1)if (!a[p]){a[p]=x; break;}elsex^=a[p];}inline int query(){int ret=0;for (int p=K;~p;p--)ret=max(ret,ret^a[p]);return ret;}};typedef vector<pair<abcd,int> > Vec;typedef map<int,int>::iterator ITER;Vec a;map<int,int> last,cnt;int ans[N];inline void Solve(int l,int r,LB lb,Vec a){int mid=(l+r)>>1;Vec ls,rs;for (int i=0;i<(signed)a.size();i++){if(a[i].first.first==l && a[i].first.second==r)lb.insert(a[i].second);else if(a[i].first.second<=mid)ls.push_back(a[i]);else if(a[i].first.first>mid)rs.push_back(a[i]);elsels.push_back(make_pair(abcd(a[i].first.first,mid),a[i].second)),rs.push_back(make_pair(abcd(mid+1,a[i].first.second),a[i].second));}if (l==r)ans[l]=lb.query();elseSolve(l,mid,lb,ls),Solve(mid+1,r,lb,rs);}int n,x;int main(){freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n);for (int i=1;i<=n;i++){read(x);if (x>0)if(++cnt[x]==1) last[x]=i;if (x<0)if(--cnt[-x]==0)a.push_back(make_pair(abcd(last[-x],i-1),-x));}for(ITER it=cnt.begin();it!=cnt.end();it++)if(it->second)a.push_back(make_pair(abcd(last[it->first],n),it->first));Solve(1,n,LB(),a);for (int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0;}


0 0
原创粉丝点击