題目描述
lyk最近在研究位運算,它研究的主要有兩個:or和xor。(c語言中對於|和^)
為了更好的了解這兩個運算子,lyk找來了乙個2^n長度的陣列。它第一次先對所有相鄰兩個數執行or操作,得到乙個2^(n-1)長度的陣列。也就是說,如果一開始時a[1],a[2],…,a[2^n],執行完第一次操作後,會得到a[1] or a[2],a[3] or a[4] ,…, a[(2^n)-1] or a[2^n]。
第二次操作,lyk會將所有相鄰兩個數執行xor操作,得到乙個2^(n-2)長度的陣列,假如第一次操作後的陣列是b[1],b[2],…,b[2^(n-1)],那麼執行完這次操作後會變成b[1] xor b[2], b[3] xor b[4] ,…, b[(2^(n-1))-1] xor b[2^(n-1)]。
第三次操作,lyk仍然將執行or操作,第四次lyk執行xor操作。如此交替進行。
最終這2^n個數一定會變成1個數。lyk想知道最終這個數是多少。
為了讓這個遊戲更好玩,lyk還會執行q次修改操作。每次修改原先的2^n長度的陣列中的某乙個數,對於每次修改操作,你需要輸出n次操作後(最後一定只剩下唯一乙個數)剩下的那個數是多少。
輸入格式(xor.in)
第一行兩個數n,q。
接下來一行2^n個數ai表示一開始的陣列。
接下來q行,每行兩個數xi,yi,表示lyk這次的修改操作是將a改成yi。
輸出格式(xor.out)
q行,表示每次修改操作後執行n次操作後剩下的那個數的值。
輸入樣例
2 41 6 3 5
1 43 4
1 21 2
輸出樣例
樣例解釋
第一次修改,->->
第二次修改,->->
第三次修改,->->
第四次修改,->->
對於30%的資料n<=17,q=1。
對於另外20%的資料n<=10,q<=1000。
對於再另外30%的資料n<=12,q<=100000。
對於100%的資料1<=n<=17,1<=q<=10^5,1<=xi<=2^n,0<=yi<2^30,0<=ai<2^30。
分析:考試的時候這道題是t3,題面又很長,就沒信心做下去直接打了個暴力,竟然還有50分,現在看,竟然就是一道裸的線段樹的題......
它的每一次操作都對應線段樹的合併操作,我們只需要記錄一下深度,看看進行哪一次操作就可以了.
#include #include#include
#include
using
namespace
std;
int n, q,maxn,c[1000010
];void build(int o, int l, int r, int
dep)
int mid = (l + r) >> 1
; build(o * 2, l, mid, dep + 1
); build(o * 2 + 1, mid + 1, r, dep + 1
);
if ((n - dep + 1) % 2 == 1
) c[o] = c[o * 2] | c[o * 2 + 1
];
else
c[o] = c[o * 2] ^ c[o * 2 + 1];}
void update(int o, int l, int r, int x, int v, int
dep)
int mid = (l + r) >> 1
;
if (x <=mid)
update(o * 2, l, mid, x, v, dep + 1
);
if (x >mid)
update(o * 2 + 1, mid + 1, r, x, v, dep + 1
);
if ((n - dep + 1) % 2 == 1
) c[o] = c[o * 2] | c[o * 2 + 1
];
else
c[o] = c[o * 2] ^ c[o * 2 + 1];}
intmain()
return0;
}
清北學堂模擬賽d3t1 a
問題描述 你是能看到第一題的friends呢。hja 怎麼快速記單詞呢?也許把單詞分類再記單詞是個不錯的選擇。何大爺給出了一種分單詞的方法,何大爺認為兩個單詞是同一類的當這兩個單詞的各個字母的個數是一樣的,如dog和god。現在何大爺給了你 個單詞,問這裡總共有多少類單詞。輸入格式 第一行乙個整數n...
清北學堂模擬賽d3t6 c
分析 比較神奇的一道題.要把樹變成環肯定要先變成鏈,然後把鏈給拼接成環.接下來考慮乙個腦洞大開的樹形dp 設f i 0 表示i不與父節點相連的鏈數,f i 1 表示i與父節點相連的鏈數,先考慮怎麼轉移f i 0 如果i不與父節點相連,那麼i肯定與兩個子節點相連,其它的子節點都不與父節點相連,而且要剪...
清北學堂模擬賽d6t3 反擊數
分析 顯然是一道數字dp題,不過需要一些奇怪的姿勢.常規的數字dp能統計出乙個區間內滿足條件的數的個數,可是我們要求第k個,怎麼辦呢?轉化為經典的二分問題,我們二分當前數的大小,看它是第幾大的,就可以了.顯然數字dp套上模板,再用上kmp的next陣列就可以了,傳遞4個引數 還剩下多少位沒有匹配,匹...