思路:線段樹,對於區間異或,可以對數的每一位都建立一顆線段樹,區間異或時,對於當前位為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,另外相鄰的兩部分不能存在包...