Wannafly挑戰賽14 E 線性基

2022-03-04 04:37:50 字數 1451 閱讀 3556

題目描述

給乙個1-base陣列,有n次操作,每次操作會使乙個位置無效。乙個區間的權值定義為這個區間裡選出一些數的異或和的最大值。求在每次操作前,所有不包含無效位置的區間的權值的最大值。

輸入描述:

第一行讀入乙個正整數(1 <= n <= 105)

第二行讀入n個正整數,第i個表示a[i](0<= a[i] <= 109)

第三行讀入n個正整數,第i個表示x[i]即第i次操作的位置,保證x[i]互不相同。

輸出描述:

輸出n行答案

示例1輸入

10169 816 709 896 58 490 97 254 99 796

4 2 3 10 5 6 1 8 9 7

輸出1023

994994

994490

490254

25499

97tags:

把刪除轉為新增,從後往前新增,每次可以用線性基快速算出異或最大值。因為還有要合併的情況,要確定祖先,所以要用個並查集維護一下。

//

#includeusing namespace std;

#pragma comment(linker, "/stack:102400000,102400000")

#define rep(i,a,b) for (int i=a; i<=b; ++i)

#define per(i,b,a) for (int i=b; i>=a; --i)

#define mes(a,b) memset(a,b,sizeof(a))

#define inf 0x3f3f3f3f

#define mp make_pair

#define pb push_back

#define fi first

#define se second

typedef long long ll;

const int n = 200005;

struct l_b

bool insert(long long val)

bool is_in(long long val)

long long query_min()

void rebuild()

int n, fa[n], cnt;

bool vis[n];

int find(int x)

void unite(int x, int y)

ll a[n], mx=0;

int x[n], id[n];

stack< ll > stack;

ll ans = 0;

int main()

while(!stack.empty())

printf("%lld\n", stack.top()), stack.pop();

return 0;

}

Wannafly挑戰賽14 F 細胞

題解 ntt 二項式定理 再逆fft求出係數ans i 本題即可解了 另 採用fft的話,複數既不方便,誤差也很大。從fft到ntt 由費馬小定理可知 gp 1 p 1 p為質數 所以利用這個性質來對應單位複數根乘方的週期性,即 includeusing namespace std typedef ...

Wannafly挑戰賽14 B 字典樹

題目描述 在乙個 minecraft 村莊中,村長有這一本小寫字母構成的名冊 字串的表 每個名字旁邊都記錄著這位村民的聲望值,而且有的村民還和別人同名。隨著時間的推移,因為沒有村民死亡,這個名冊變得十分大。現在需要您來幫忙維護這個名冊,支援下列 4 種操作 插入新人名 si,聲望為 ai 給定名字字...

Wannafly挑戰賽20 E特徵值

輸入描述 輸入包括若干行 第一行包括乙個數t,表示接了下來有t 組資料 對於每一組資料,第一行包括乙個整數n,表示矩陣大小 接下來n行,每行包括n個數,表示這個01矩陣中的數,資料保證合法 t 10,1 n 100 輸出描述 輸出包括t行 每一行需要輸出乙個yes或no,表示該01矩陣是否所有特徵值...