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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)

發(fā)布時(shí)間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出一個(gè)長(zhǎng)度為 nnn 的數(shù)列 aaa,現(xiàn)在需要執(zhí)行 mmm 次操作,每次操作分為兩種類型:

  • 1lrx1 \ l \ r \ x1?l?r?x:對(duì)于所有 i∈[l,r]i \in [l,r]i[l,r] 執(zhí)行 ai=max(ai,x)a_i=max(a_i,x)ai?=max(ai?,x)
  • 2lrx2 \ l \ r \ x2?l?r?x:對(duì)于區(qū)間 [l,r][l,r][l,r] 內(nèi)的 aia_iai? 加上 xxx 這一共 r?l+2r-l+2r?l+2 個(gè)數(shù)進(jìn)行尼姆游戲,問先手必勝的情況下第一次能有多少種不同的取石子方案
  • 題目分析:操作 111 不難想到吉司機(jī)線段樹,所以只需要將操作 222 轉(zhuǎn)換一下就可以了

    下面參考官方題解:

    對(duì)于所有數(shù)組的尼姆游戲,先求出其異或和 xorxorxor,如果 xor=0xor=0xor=0 顯然答案為 000,如果不為 000 的話需要挑選某一堆石子進(jìn)行取數(shù),假設(shè)某一堆石子為 yyy,如果想要從這堆石子取數(shù),需要滿足 y?(xor⊕y)>0y-(xor\oplus y)>0y?(xory)>0 才行,移項(xiàng)得到 y>xor⊕yy>xor\oplus yy>xory,考慮對(duì)于 xorxorxor 的最高位來說,如果 yyy 的這一位也是 111 的話,前面的不等式顯然滿足,反之 y<xor⊕yy<xor\oplus yy<xory 成立,所以現(xiàn)在操作 222 的目標(biāo)轉(zhuǎn)換為了:

  • 求區(qū)間異或值
  • 求二進(jìn)制下區(qū)間內(nèi)等于某個(gè)數(shù)的個(gè)數(shù)
  • 因?yàn)椴僮?222 需要求某個(gè)二進(jìn)制的個(gè)數(shù),還要求異或的答案,所以在儲(chǔ)存的時(shí)候就可以直接按位儲(chǔ)存區(qū)間和

    代碼:

    // #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<unordered_map> using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=2e5+100; int sum[30]; struct Node {int l,r,num,mmin,se_mmin;//num:最小值的個(gè)數(shù),mmin:區(qū)間最小值,se_mmin:次小值 int sum[30]; }tree[N<<2]; void pushup(int k) {tree[k].num=0;for(int i=0;i<30;i++)tree[k].sum[i]=tree[k<<1].sum[i]+tree[k<<1|1].sum[i];tree[k].mmin=min(tree[k<<1].mmin,tree[k<<1|1].mmin);tree[k].se_mmin=min(tree[k<<1].se_mmin,tree[k<<1|1].se_mmin);if(tree[k].mmin==tree[k<<1].mmin)tree[k].num+=tree[k<<1].num;elsetree[k].se_mmin=min(tree[k].se_mmin,tree[k<<1].mmin);if(tree[k].mmin==tree[k<<1|1].mmin)tree[k].num+=tree[k<<1|1].num;elsetree[k].se_mmin=min(tree[k].se_mmin,tree[k<<1|1].mmin); } void change(int k,int pre,int cur) {for(int i=0;i<30;i++){if((pre>>i)&1) tree[k].sum[i]-=tree[k].num;if((cur>>i)&1) tree[k].sum[i]+=tree[k].num;} } void pushdown(int k) {if(tree[k].mmin>tree[k<<1].mmin){change(k<<1,tree[k<<1].mmin,tree[k].mmin);tree[k<<1].mmin=tree[k].mmin;}if(tree[k].mmin>tree[k<<1|1].mmin){change(k<<1|1,tree[k<<1|1].mmin,tree[k].mmin);tree[k<<1|1].mmin=tree[k].mmin;} } void build(int k,int l,int r) {tree[k].l=l,tree[k].r=r;if(l==r){scanf("%d",&tree[k].mmin);tree[k].se_mmin=INT_MAX;tree[k].num=1;change(k,0,tree[k].mmin);return;}int mid=(l+r)>>1;build(k<<1,l,mid),build(k<<1|1,mid+1,r);pushup(k); } void update(int k,int l,int r,int val) {if(tree[k].mmin>=val) return;if(tree[k].l>r||tree[k].r<l) return;if(tree[k].l>=l&&tree[k].r<=r&&val<tree[k].se_mmin){change(k,tree[k].mmin,val);tree[k].mmin=val;return;}pushdown(k);update(k<<1,l,r,val),update(k<<1|1,l,r,val);pushup(k); } void query(int k,int l,int r) {if(tree[k].l>r||tree[k].r<l) return;if(tree[k].l>=l&&tree[k].r<=r){for(int i=0;i<30;i++) sum[i]+=tree[k].sum[i];return;}pushdown(k);query(k<<1,l,r),query(k<<1|1,l,r); } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n,m;read(n),read(m);build(1,1,n);while(m--){int op,l,r,x;read(op),read(l),read(r),read(x);if(op==1) update(1,l,r,x);else if(op==2){int t=x;memset(sum,0,sizeof(sum));query(1,l,r);for(int i=0;i<30;i++) if(sum[i]&1) x^=(1<<i);if(!x){puts("0");continue;}int h=log2(x);write(sum[h]+((t>>h)&1)),putchar('\n');}}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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