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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

SD 胡策 Round 1 T3 彩尾巴猹的二进制数

發(fā)布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SD 胡策 Round 1 T3 彩尾巴猹的二进制数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

? ? 發(fā)現(xiàn)一個區(qū)間[L,R]代表的2進(jìn)制數(shù)是3的倍數(shù),當(dāng)且僅當(dāng)從L開始的后綴二進(jìn)制值 - 從R+1開始的后綴二進(jìn)制值 是 3 的倍數(shù) (具體證明因為太簡單而被屏蔽)。

? ? 于是我們就可以在每個點維護(hù)從它開始的后綴二進(jìn)制數(shù)的值,因為在%3同余系下只有3個數(shù),所以我們可以很容易的用線段樹進(jìn)行區(qū)間維護(hù),然后答案就是 C(num[0],2) + C(num[1],2) + C(num[2],2)? ? [注意如果查詢區(qū)間是 [l,r]的話那么 在線段樹中查找的區(qū)間是 [l,r+1] ,因為區(qū)間[x,y]對應(yīng) x和y+1后綴相減]。

? ? 但是有修改咋辦呢?

? ? 給每個位置設(shè)一個權(quán)值,后綴長度是奇數(shù)的權(quán)值是1,反之則是2。

? ? 然后稍微動腦子想一下,如果? 一個位置修改前是 1? 和? 這個位置權(quán)值是 1? 這兩個條件只滿足其中一個,那么就是對前綴區(qū)間 +1;否則就是對前綴區(qū)間+2。

? ? 所以隨便寫個線段樹打打標(biāo)記就好啦。

?

#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=500005; int a[maxn],val[maxn],tag[maxn*4]; int n,m,sum[maxn*4][3],hz[maxn]; int le,ri,W,opt,ans[3];inline int read(){int x=0; char ch=getchar();for(;!isdigit(ch);ch=getchar());for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';return x; }inline int add(int x,int y){ x+=y; return x>=3?x-3:x;}inline void maintain(int o,int lc,int rc){sum[o][0]=sum[lc][0]+sum[rc][0];sum[o][1]=sum[lc][1]+sum[rc][1];sum[o][2]=sum[lc][2]+sum[rc][2]; }inline void CG(int o,int VAL){int T=sum[o][0];tag[o]=add(tag[o],VAL);if(VAL==1){sum[o][0]=sum[o][2];sum[o][2]=sum[o][1];sum[o][1]=T;}else{sum[o][0]=sum[o][1];sum[o][1]=sum[o][2];sum[o][2]=T;} }inline void pushdown(int o,int lc,int rc){if(tag[o]){CG(lc,tag[o]),CG(rc,tag[o]);tag[o]=0;} }void build(int o,int l,int r){if(l==r){sum[o][hz[l]]++;return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;build(lc,l,mid),build(rc,mid+1,r);maintain(o,lc,rc); }void update(int o,int l,int r){if(l>=le&&r<=ri){CG(o,W);return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;pushdown(o,lc,rc);if(le<=mid) update(lc,l,mid);if(ri>mid) update(rc,mid+1,r);maintain(o,lc,rc); }void query(int o,int l,int r){if(l>=le&&r<=ri){ans[0]+=sum[o][0];ans[1]+=sum[o][1];ans[2]+=sum[o][2];return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;pushdown(o,lc,rc);if(le<=mid) query(lc,l,mid);if(ri>mid) query(rc,mid+1,r); }inline ll getC(int x){ return x?x*(ll)(x-1)>>1:0;}inline void solve(){while(m--){opt=read();if(opt==1){le=1,ri=read();if(a[ri]+val[ri]==2) W=2; else W=1;a[ri]^=1,update(1,1,n);}else{le=read(),ri=read(),ri++;ans[0]=ans[1]=ans[2]=0;query(1,1,n);printf("%lld\n",getC(ans[0])+getC(ans[1])+getC(ans[2]));}} }int main(){n=read(),m=read();for(int i=1;i<=n;i++) a[i]=read();n++,val[n]=2,hz[n]=0;for(int i=n-1;i;i--){val[i]=3-val[i+1];hz[i]=add(hz[i+1],val[i]*a[i]);}build(1,1,n);solve();return 0; }

  

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

總結(jié)

以上是生活随笔為你收集整理的SD 胡策 Round 1 T3 彩尾巴猹的二进制数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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