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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 979D Kuro and GCD and XOR and SUM(字典树+暴力+模拟)

發布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 979D Kuro and GCD and XOR and SUM(字典树+暴力+模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:說實話看到這么復雜而且還是英文的題面我是拒絕的,但題還是得補啊,就去百度找的題解看題意,題意大概是這樣的:

給出n個操作,每個操作分為兩種類型:

  • 1 x:向集合中插入x
  • 2 x k s:我們需要在集合中找到一個v,使其滿足下面的條件:
  • gcd(x,v)%k==0
  • x+v<=s
  • x^v最大
  • 模擬每一次操作

    題目分析:看完題意之后,肯定不能直接上手就模擬啊,就比如題目讓求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(字典树+暴力+模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

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