日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【鏈接】點擊打開鏈接


【題意】


給出一個數組,每次操作將整個數組亦或一個數x,問得到的數組的結果中的mex.mex表示為自然數中第一個沒有出現過的數。

【題解】


異或的效果是可以累加的,所以不用每次都算出來每一次的a是什么。而只要把前i個詢問的x取一下異或和now,然后用異或和對每個ai異或就可以了。 對于這道題.我們需要用字典樹來做. 對于一開始的a數組中沒有出現的數字,都把它按照位加入到字典樹中,最多19位。 原數組a,然后沒出現的數字組成數組A. 結論:則我們對原數組進行一次異或操作即a xor 了x,則異或之后的a數組的mex值就是A數組也xor x之后的最小值。 感性的證明: 假設進行了一次異或操作. 則,相當于把每個數字的二進制形式中的一些1翻轉成了0,而0翻轉成了1,就是x的二進制中為1的那些位置都進行了翻轉操作,那么假如數字t沒有出現過,則進行了一次異或操作之后,t可能就出現了,而t xor x可能就沒有出現了,則我們就直接認為t出現了,而t xor x變成沒有出現的了. 可以這么做是因為,如果t xor x也是沒有出現的話,它也會對x進行異或操作,則也會認為t是沒有出現的,這樣之前認為t出現過的錯誤結論就能得到訂正,這樣就不會造成錯解了,t 和 t xor x還是都沒出現的 而如果沒有出現的數字里面沒有t xor x的話,那就說明原數組里面有t xor x這個數字,則進行異或操作之后還是會有t這個數字,則之前的結論也就對了,而進行了異或操作之后 t xor x也就變成沒有出現過的了 也就是說,A里面的數字,xor之后還是沒有出現的.且只有這些數字是沒有出現的
這樣就感性地解釋了那個結論. 那么現在的問題就變為,給你一個數字X,然后讓你在A里面找一個數字,然后Ai和X的異或值最小. 則我們從高位開始,盡量讓Ai的位和X的對應位一樣(異或結果就變成0),這樣高位就盡量小了。 字典樹的作用就在此。

【錯的次數】


1

【反思】


反面去考慮問題,從中得到結論. 二進制的問題好多和字典樹有關呢。 那個結論挺難想的。

【代碼】

/**/ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <map> #include <queue> #include <iomanip> #include <set> #include <cstdlib> #include <cmath> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb emplace_back #define fi first #define se second #define ld long double #define ms(x,y) memset(x,y,sizeof x) #define ri(x) scanf("%d",&x) #define rl(x) scanf("%lld",&x) #define rs(x) scanf("%s",x) #define rf(x) scnaf("%lf",&x) #define oi(x) printf("%d",x) #define ol(x) printf("%lld",x) #define oc putchar(' ') #define os(x) printf(x) #define all(x) x.begin(),x.end() #define Open() freopen("F:\\rush.txt","r",stdin) #define Close() ios::sync_with_stdio(0) #define sz(x) ((int) x.size()) #define ld long doubletypedef pair<int, int> pii; typedef pair<LL, LL> pll;//mt19937 myrand(time(0)); //int get_rand(int n){return myrand()%n + 1;} const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 }; const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 }; const double pi = acos(-1.0); const int N = 19;struct node {node *ch[2];int val;node() { ch[0] = ch[1] = NULL; val = 0; } } *root;int n, m, a[N + 10]; bool bo[1 << N];void insert(int x) {node *p = root;rep2(i, (N-1), 0) {int temp = (x >> i) & 1;if (p->ch[temp] == NULL) p->ch[temp] = new node();p = p->ch[temp];}p->val = x; }int query(int x) {node *p = root;rep2(i, (N-1), 0) {int temp = (x >> i) & 1;if (p->ch[temp] == NULL)p = p->ch[temp ^ 1];elsep = p->ch[temp];}return p->val; }int main() {//Open();//Close();root = new node();ri(n), ri(m);rep1(i, 1, n) {int x;ri(x);bo[x] = 1;}rep1(i, 0, (1 << N)-1) if (!bo[i])insert(i);int now = 0;rep1(i, 1, m) {int x;ri(x);now ^= x;oi(now^query(now)); puts("");}return 0; }

轉載于:https://www.cnblogs.com/AWCXV/p/7626069.html

總結

以上是生活随笔為你收集整理的【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。