CodeForces - 979D Kuro and GCD and XOR and SUM(字典树+暴力+模拟)
題目鏈接:點擊查看
題目大意:說實話看到這么復雜而且還是英文的題面我是拒絕的,但題還是得補啊,就去百度找的題解看題意,題意大概是這樣的:
給出n個操作,每個操作分為兩種類型:
模擬每一次操作
題目分析:看完題意之后,肯定不能直接上手就模擬啊,就比如題目讓求gcd,還能真的就是去求gcd嘛,我們需要盡可能的簡化題意,首先,gcd(x,v)%k==0,也就是說x%k==0&&v%k==0,然后x^v最大看似是經典的字典樹求異或問題,但還是需要分類討論一下的,若k等于1的時候,我們就可以對于經典的01字典樹改動一下即可,因為經典的01字典數的查找函數最后輸出的是異或之后的結果,而本題要求輸出的卻是哪個值,所以我們需要映射一下,這個一會再說,那么關于x+v<=s這個情況,我們可以移項,從而轉換為v<=s-x,也就是給v規定了一個取值范圍而已,并不是什么麻煩的事情,現在處理完了k等于1的情況,那么k不等于1該怎么辦呢?一開始我實在想不到好的辦法,若是枚舉的話我感覺會爆。。因為假如1e5個操作的s都給的是1e5,而k給的都是2,那時間復雜度都到了1e10了,但顯然題目沒有這么狠,所以網上的正解都是直接暴力即可 ,我也納悶,題目是不是故意卡k==1的數據了,然后其他的都沒怎么卡,因為不加字典樹優化的話會T,加了字典樹優化的話幾十毫秒就過了,我人都呆住了??
上代碼吧,沒什么好說的了,反正我是想不到可以暴力:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int trie[N*20][2];int mmin[N*20];//儲存經過每個節點的最小值bool vis[N];int cnt=0;void insert(int x) {int pos=0;mmin[pos]=min(mmin[pos],x);for(int i=19;i>=0;i--){int to=(x>>i)&1;if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];mmin[pos]=min(mmin[pos],x);} } int search(int x,int limit) {int pos=0;if(mmin[pos]>limit)return -1;for(int i=19;i>=0;i--){int to=(x>>i)&1;if(trie[pos][!to]&&mmin[trie[pos][!to]]<=limit)//判斷條件改一下pos=trie[pos][!to];elsepos=trie[pos][to];}return mmin[pos];//注意這里,返回的應該是哪個值,而不是異或后的結果 }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n;memset(mmin,inf,sizeof(mmin));scanf("%d",&n);while(n--){int op;scanf("%d",&op);if(op==1){int x;scanf("%d",&x);insert(x);vis[x]=true;}else{int x,k,s;scanf("%d%d%d",&x,&k,&s);if(x%k){printf("-1\n");continue;}if(k==1)printf("%d\n",search(x,s-x));else{int ans=-1,mmax=-1;for(int i=k;i<=s-x;i+=k){if(!vis[i])continue;if((i^x)>mmax)//注意這里,位運算的優先級比比較運算符要低,所以要加括號{mmax=i^x;ans=i;}}printf("%d\n",ans);}}}return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 979D Kuro and GCD and XOR and SUM(字典树+暴力+模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1236D A
- 下一篇: POJ - 1330 Nearest C