Ynoi 2011 競賽實驗班

2022-09-14 17:24:12 字數 1282 閱讀 9967

目錄傳送門

奇妙的拼盤題。

首先考慮沒有操作 \(1,4\) 我們可以怎麼做。將數字進行拆位,這樣可以按位做乙個 \(0,1\) 的字首和。這是 \(\mathcal o(n\log v)\) 的。

如果加上操作 \(4\) 呢?可以利用 \(\rm trie\) 樹,在插入的時候就會幫你排好序。具體而言,先將所有數字的原始值插入 \(\rm trie\) 樹。一次查詢 \((l,r)\) 可以將其差分一下,變成查詢當前數列前 \(x\) 個數的和。假設在某次排序之前所有操作 \(3\) 的異或和為 \(val\),並維護所有操作 \(3\) 的異或和 \(all\)。可以發現,某個數在數列中的位置和初始值、\(val\) 有關。在遍歷 \(\rm trie\) 樹時,我們不能認為 \(0\) 方向比 \(1\) 方向小,而是認為 \(val\) 在這一位的方向比另一位的方向更小。所以在每次排序後,我們都需要處理出 \(rev_i\) 表示每一位到底哪個方向更小。這是 \(\mathcal o(n\log^2 v)\) 的。

再加上操作 \(1\)?因為序列由 "有序 + 無序" 構成,在下一次排序之前,我們將操作 \(1\) 加入的數做最前面的字首和,排序時插入即可。注意加入的數要異或上當前的 \(all\)。

總時間複雜度 \(\mathcal o(n\log^2 v)\)。

#include #define print(x,y) write(x),putchar(y)

template inline t read(const t sample)

template inline void write(const t x)

if(x>9) write(x/10);

putchar(x%10^48);

}typedef long long ll;

const int maxn=1e5+5;

int n,a[maxn<<1],all,t[maxn*62][2],idx;

int cur,siz[maxn*62],cnt[maxn*62][31];

int pre[maxn<<1][31],rev[31];

void ins(int x)

}ll ask(int l,int r)

signed main()

int op,x,y;

for(int m=read(9);m;--m)

else if(op==2)

else if(op==3) all^=read(9);

else

} return 0;

}

實驗班echo小組申請

註明 因為csdn寫部落格需要審核,時間比較長 所以所以我們小組部落格換位址了 新部落格位址 小組名稱 echo 小組隊長 蔡元媛 暫定 小組成員 邢順凱,李雁南,蔡元媛,張立 祖榮 小組文化與成立目的 e代表internet ch代表change o word 地球是圓的 簡單來說就是一隊熱愛並且...

實驗班,夢想放飛的地方

記得在實驗班成立的那次儀式上,包老師在校 院系領導及實驗班35位成員面前做了一次很正式的發言,題目就是石油軟體實驗班 夢想放飛的地方,創辦這個實驗班,包老師在內心可能對這個實驗班的未來有乙個比較清晰的預計,但是,說實話,在底下的我們除了新鮮事物故有的新鮮感外,未來更多的是不確定。實驗班二年生活一晃就...

NEUQ2020 實驗班 訓練001(1 5題)

在帶權有向圖g中,求g中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。解決這個問題的乙個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為o n 3 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是o n 3 但演算法的形式簡單很多。在本題中,讀入乙...