題目描述
給乙個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矩陣是否所有特徵值...