日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 4184 shallot 时间线建线段树+vector+线性基

發(fā)布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 4184 shallot 时间线建线段树+vector+线性基 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目大意

n個時間點
每個時間點可以插入一個權(quán)值或刪除一個權(quán)值
求每個時間點結(jié)束后異或最大值

分析

異或最大值用線性基
但是線性基并不支持刪除操作
我們可以對時間線建一棵線段樹
離線搞出每個權(quán)值出現(xiàn)的區(qū)間
cover一下
先用vector存起來
最后每個時間點有的權(quán)值,就是線段樹上
該葉子節(jié)點的所有祖先的權(quán)值
DFS一下動態(tài)維護一個只用插入的線性基就好了

注意

考慮如果手上有兩個A權(quán)值,刪除一個時怎么處理
開多一個num存數(shù)量,fir存權(quán)值最早出現(xiàn)位置
于是數(shù)據(jù)貌似并沒有這種情況?。。。

solution

#include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int M=500007; const int Bit=30;inline int rd(){int x=0;bool f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(;isdigit(c);c=getchar()) x=x*10+c-48;return f?x:-x; }int n; int a[M],val[M],tt; int ty[M]; int fir[M],num[M]; int ans[M];struct Base{int v[Bit+1];Base(){memset(v,0,sizeof(v));}int getmx(){int res=0;for(int i=Bit;i>=0;i--) if(v[i]) res^=v[i];return res;} };Base operator +(Base x,int y){int i,ps=-1;for(i=Bit;i>=0;i--)if(y>>i&1){if(x.v[i]==0 && ps==-1) ps=i;else y^=x.v[i];}if(~ps){x.v[ps]=y;for(i=Bit;i>ps;i--)if(x.v[i]>>ps&1) x.v[i]^=y;}return x; }struct pai{int d,id;pai(int dd=0,int ii=0){d=dd;id=ii;} }pp[M];bool cmp(pai x,pai y){return x.d<y.d; }vector<int>hd[M<<2];void ins(int x,int l,int r,int tl,int tr,int d){if(tl<=l&&r<=tr){hd[x].push_back(d);return;}int mid=l+r>>1;if(tl<=mid) ins(x<<1,l,mid,tl,tr,d);if(mid<tr) ins(x<<1|1,mid+1,r,tl,tr,d); }void DFS(int x,int l,int r,Base nw){int i;for(i=1;i<=hd[x].size();i++) nw=nw+hd[x][i-1];if(l==r){ans[l]=nw.getmx();return ;}int mid=l+r>>1;DFS(x<<1,l,mid,nw);DFS(x<<1|1,mid+1,r,nw); }int main(){int i,x;n=rd();for(i=1;i<=n;i++){x=rd();ty[i]=x>0;x=abs(x);pp[i]=pai(x,i);}sort(pp+1,pp+n+1,cmp);pp[0].d=pp[1].d-1;for(i=1;i<=n;i++){if(pp[i].d!=pp[i-1].d) val[++tt]=pp[i].d;a[pp[i].id]=tt;}for(i=1;i<=n;i++){if(ty[i]==1){if(num[a[i]]==0) fir[a[i]]=i;num[a[i]]++;}else{if(num[a[i]]>0) ins(1,1,n, fir[a[i]],i-1, val[a[i]]);num[a[i]]--;}}for(i=1;i<=tt;i++)if(num[i]) ins(1,1,n, fir[i],n, val[i]);Base nw;DFS(1,1,n,nw);for(i=1;i<=n;i++) printf("%d\n",ans[i]);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/acha/p/6418490.html

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的bzoj 4184 shallot 时间线建线段树+vector+线性基的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。