problem i: qwb vs 去汙棒
time limit: 2 sec memory limit: 256 mb
submit: 95 solved: 36
[submit][status][web board]
description
qwb表白學姐失敗後,鬱鬱寡歡,整天坐在太陽底下賞月。在外人看來,他每天自言自語,其實他在和自己的影子「去汙棒」聊天。
去汙棒和qwb互相出題考驗對方,去汙棒問了qwb這樣乙個問題:
現已知乙個有n個正整數的序列a[1],a[2]…a[n],接下來有m個操作
操作一共有兩種:
1.在序列末尾新增乙個數x。
2.查詢suf[p] xor x的最大值,其中xor是異或 ,l<=p<=r,
suf[t]表示從t開始的字尾的異或和,即suf[t]=a[t] xor a[t+1] xor …xor a[len],len為序列長度。
input
第一行乙個整數t(<=5),表示一共有t組資料。
每組資料第一行兩個整數n(<=200000),m(<=200000),意義如上所述。
隨後一行有n個數,表示初始序列。
隨後m行,每行表示乙個操作。
操作有兩種,1: x 表示在末尾新增乙個x,2: l r x表示查詢suf[p] xor x的最大值,其中l<= p <= r,
所有數及x不超過224 且保證所有操作合法。
output
每組測試資料的第一行輸出」case x:」,x為資料組數的標號,從1開始。
接下來,對每個操作2輸出一行答案。
sample input
1 5 5
1 2 3 4 5
2 1 3 4
1 10
1 7
2 4 4 5
2 1 5 19
sample output
case 1:
6 9
31hint
這種涉及到可持續的增添元素而且頻繁的求最值的,用脫機會比較方便。然後如果學過trie樹來處理數的異或的話,會知道,數的異或最大值,只要往異或的相反方向走就好。
對於這種持續刪減修改,明顯是可持續結構,可以保留上乙個邊界的值。
每個結點儲存的是乙個字尾和 然後利用 x^(y^k)=(x^y)^k 來得到結果。 x指的是 p[i].x y指的是字尾和。但是對於後面的操作1(在末尾增加元素),字尾和也加了進去,所以需要用異或刪掉 這個是k。
可持續化就是有這麼乙個優點,你能得到所有的區間變化的情況。
而且從中選出最優的
還是太難,即使明白原理也不想不到。
#include
using
namespace
std;
const
int n=400010;
struct trie
;trie l[n*27];
int tot,root[n];
int suf[n],arr[n];
int ans[n];
int n,m;
struct node
p[n];
void init()
void update(int &cur,int ori,int step,int n,int v)
int find(int s,int e,int step,int n)
else
return find(l[s].nxt[t],l[e].nxt[t],step-1,n);
}int main()
for(int i=1;i<=m;i++)
else
if(p[i].ops==2)
}suf[n+1]=0;
for(int i=n;i>=1;i--)
int last=0;
int sz=0;
printf("case %d:\n", cc);
for(int i=m;i>=1;i--)
else
}for(int i=sz;i>=1;i--)
}}
可持續監測直線度測量儀持續檢測鈦棒尺寸
棒材測徑儀採用的是3台測徑儀,通過演算法計算得到直線度的尺寸,3台測徑儀選用雙路測徑儀,來實現2個方向的外徑測量,3台測徑儀,總共可以測量6組直徑資料。測量時系統根據測頭1和測頭3的測量的上 下兩個邊沿位置值擬合一條直線,位置2的測量值與該直線的偏差即為位置2的直線度誤差。上下沿的直線度誤差的平均值...
hdu2665 可持續化線段樹
a的第一道可持續化線段樹。我是看這個看懂的 可持續化線段樹,主要思想就是利用歷史資訊,減少時間和記憶體花銷。比方有兩棵線段樹,但是他們只有乙個節點資訊不同。仔細一想,在這兩顆線段樹上,對應的 l,r 節點 只有log n 個節點不同。那麼,除了不同的節點,其他節點資訊,他們完全可以共用。關於這題解法...
01Trie 可持久化01Trie學習筆記
之前一直不把trie當回事,直到今天看了篇部落格,據說01trie可以當平衡樹使?然後就學了學,發現和權值線段樹也沒什麼區別 01trie 權值線段樹的本質是一棵01trie 01trie就是把數字的二進位制位從高到低當做字串扔進trie裡 巨佬一眼就能看出,把最高位是0的當做左兒子,最高位是1的當...