題意:給出n個數,接下來有m次操作。
1 k:在陣列後面多加乙個k。(n=n+1)。
0 l r:詢問[l,r]區間內任意取數,異或和的最大值。
特別要注意的是2種操作都加密了,1號操作需要k=k^lasten;2號操作需要l=(l^lasten)%n+1,r=(r^lasten)%n+1.lasten初始值為0,以後lasten為上一次0號操作的答案。
思路:字首線性基。建立二維陣列pre_p[1000009][maxbit],表示從1~i前i個數組成的線性基。建立陣列pre_pos[1000009][maxbit],表示對於第i個字首線性基第j位為1的數的最大下標(另一種理解: 對於區間[1,i]內的數,二進位制第j位為1的最大下標。可能是由不止乙個數異或而成的,此時記錄這幾個數的最小下標)。
對於每一次1號操作,都要在重新維護pre_p陣列和pre_pos陣列。
對於0號操作,我們按普通的線性基用法使用pre_p[r],不同的就是對於每乙個不為0的pre_p[r][j]都要判斷pre_pos[r][j]>=l是否成立。即當右端點固定為r時,pre[r][j]是否可以在l以後出現。
(本人原本maxbit開的是32,然後一直血wa,換成31就過了,血的教訓)
#includeusing namespace std;const int maxbit=31;
#define met(a,b) memset(a,b,sizeof(a))
int p[maxbit+5],pos[maxbit+5],pre_p[1000009][maxbit],pre_pos[1000009][maxbit];
void solve(int val,int adr )//建立1~adr的字首線性基
return k;
}int main()
int lastans=0;
for(int t=0; t>f;
if(f)
else
}return 0;
}
2019杭電多校第二場
今天也是一條鹹魚orz 場上三題 e,j,k e everything is generated in equal probability 題解 乙個長度為n的排列的逆序期望為c n,2 2 因為每一對下標的貢獻都是1 2.然後設dp i dp i dp i 為長度為i ii的隨機排列的culcul...
2019杭電多校第二場
給定乙個 n 從 1,n 中等概率取出乙個數,再等概率生成乙個 n 的全排列,再計算這個全排列的函式值,求這個函式值的期望。函式表達為輸入乙個全排列,計算其逆序數,再等概率取出乙個子串行 可以是空,可以是原序列 遞迴計算該子串行的函式值,累加返回。include using namespace st...
2019 杭電多校第二場 string
題意 找到所有的回文串滿足它的前一半也是回文串。思路 回文自動機 樹上倍增 我們要處理兩件事情,第一件是每種回文串出現了多少次。我們回想回文自動機的構造過程,發現fail指標只會由標號大的指向標號小的。這樣我們只需要標號從大到小遍歷即可處理出每種回文串出現的次數。第二件是倍增的寫法,倍增是不需要初始...