牛客小白月賽9 C 紅球進黑洞

2021-09-01 12:35:22 字數 1269 閱讀 9960

思路:線段樹,對於區間異或,可以對數的每一位都建立一顆線段樹,區間異或時,對於當前位為0的不用考慮,當前位為1時,則將區間的0->1,1->0,即更新為 sum[i]=r-l+1-sum[i]即可

code:

#include#include#include#define lc rt<<1

#define lson l,m,rt<<1

#define rc rt<<1|1

#define rson m+1,r,rt<<1|1

using namespace std;

typedef long long ll;

const int max_n=1e5+5;

int n,m,q,t,pi;

ll a[max_n][25];

struct segt

void build(int l,int r,int rt)

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void pushdown(int l,int r,int rt)

}void update(int l,int r,int v,int l,int r,int rt)

pushdown(l,r,rt);

int m=(l+r)>>1;

if(l<=m)update(l,r,v,lson);

if(m+1<=r)update(l,r,v,rson);

pushup(rt);

}ll query(int l,int r,int l,int r,int rt)

pushdown(l,r,rt);

int m=(l+r)>>1;

ll ret=0;

if(l<=m) ret=ret+query(l,r,lson);

if(m+1<=r) ret=ret+query(l,r,rson);

return ret;

}};segt seg1[25];

int main()

for(int i=1;i<=20;++i)

pi=i,seg1[i].build(1,n,1);

int t,l,r,p;

while(q--)else

}

return 0;

}

牛客 紅球進黑洞 (線段樹 位運算)

銘宇巨巨推薦的題!原題鏈結 題意 給定乙個序列,兩種操作,一是區間求和,二是將區間裡的每個數都異或x。思路 一眼就線段樹,關鍵是怎麼維護第二個操作。借助最小異或生成樹的思想以及異或題的常見套路,我們可以把每個數都進行二進位制拆分,用線段樹分別維護每一位上的0和1。對於操作二,我們只需要分別維護每一位...

牛客小白月賽9 A B C E F H J

a 簽到 ans 1 都沒有扔下來的概率 處理逆元取模即可 include define ll long long using namespace std const int mod 1e9 7 ll ksm ll a,ll b return ans int main include define ...

牛客假日團隊賽9 C 單詞接龍

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包...