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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #498 (Div. 3)【完结】

發布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #498 (Div. 3)【完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2022.3.6
題單地址:https://codeforces.com/contest/1006

目錄

  • A. Adjacent Replacements
  • B. Polycarp's Practice【貪心】
  • C. Three Parts of the Array【前綴和 / 哈希】
  • D. Two Strings Swaps【分類討論】
  • E. Military Problem【dfs】
  • F. Xor-Paths【雙向搜索 / 折半搜索】

A. Adjacent Replacements


奇數全部變為比它大1的偶數,然后偶數全部再變成比自己小一的奇數,
可以看出。奇數變了兩次沒變,而偶數變成了比自己小1的奇數

#include<bits/stdc++.h> using namespace std; const int N=1010; int a[N],n; int main(void) {cin>>n;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){if(a[i]&1) cout<<a[i]<<" ";else cout<<a[i]-1<<" ";}return 0; }

B. Polycarp’s Practice【貪心】

#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5+10; LL n,k,x,sum; vector<pair<int,int>>ve; int main(void) {cin>>n>>k;ve.push_back({-1,-1});//哨兵,讓其從下標1開始for(int i=1;i<=n;i++) cin>>x,ve.push_back({x,i});sort(ve.begin()+1,ve.end());for(int i=n-k+1;i<=n;i++) sum+=ve[i].first;//取最大的k個值cout<<sum<<endl;vector<int>a;for(int i=n-k+1;i<=n;i++) a.push_back(ve[i].second);//將最大的k個值的下標存儲,排序。sort(a.begin(),a.end());int l=0;for(int i=0;i<a.size()-1;i++) cout<<a[i]-l<<" ",l=a[i];//以次分割cout<<n-l;return 0; }

C. Three Parts of the Array【前綴和 / 哈希】

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; typedef long long int LL; LL a[N],s[N],n; map<LL,int>mp; int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i],mp[s[i]]=i;LL sum=0,ans=0;for(int i=n;i>=1;i--){sum+=a[i];if(mp.count(sum)&&mp[sum]<i) ans=max(ans,sum);}cout<<ans;return 0; }

D. Two Strings Swaps【分類討論】


題目的意思就是說我們需要預處理,使其可以根據上面的移動規則變成來相等的字符串。
預處理只可以該a字符串。
你會發現a[i] a[n-i+1] b[i] b[n-i+1]四個字符是可以互相移動的。故只需分類討論這四個字符即可。
詳細題解

#include<bits/stdc++.h> using namespace std; string a,b; int n,ans; int main(void) {cin>>n>>a>>b;for(int i=0;i<n/2;i++){map<char,int>mp;vector< pair<char,int> >ve;mp[a[i]]++,mp[a[n-i-1]]++,mp[b[i]]++,mp[b[n-1-i]]++;if(mp.size()==1) continue;for(auto j=mp.begin();j!=mp.end();j++) ve.push_back({j->first,j->second});if(ve.size()==2){if(ve[0].second==2&&ve[1].second==2) continue;ans++;}else if(ve.size()==3){if(a[i]==a[n-i-1]) ans+=2;else ans++;}else if(ve.size()==4) ans+=2;}if((n&1) && a[n/2]!=b[n/2] ) ans++;cout<<ans;return 0; }

E. Military Problem【dfs】


你會發現一個根和它的兒子都是挨著的。

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; vector<int>ve[N],path; int st[N],mp[N],n,m,x; int dfs(int u) {path.push_back(u);st[u]=1;for(int i=0;i<ve[u].size();i++) st[u]+=dfs(ve[u][i]);return st[u]; } int main(void) {scanf("%d%d",&n,&m);for(int i=2;i<=n;i++) scanf("%d",&x),ve[x].push_back(i);dfs(1);for(int i=0;i<path.size();i++) mp[path[i]]=i;while(m--){int u,k; scanf("%d%d",&u,&k);if(k>st[u]) puts("-1");//k大于以u為根的結點個數else printf("%d\n",path[mp[u]+k-1]);}return 0; }

F. Xor-Paths【雙向搜索 / 折半搜索】


如果直接暴力的搜索,那么時間復雜度為2^(n+m)一定會T的
但是我們可以雙向的搜索,即一個從開始的(1,1)搜索,一個從結束的(n,m)開始搜索。
每次都走一半的路程,那么總的時間復雜度為2^(n+m)/2 +2^(n+m)/2 最多不過1e6的時間復雜度是可以過的。

#include<bits/stdc++.h> using namespace std; const int N=25; typedef long long int LL; LL a[N][N],n,m,k,ans; int dx1[2]={0,1},dy1[2]={1,0}; int dx2[2]={-1,0},dy2[2]={0,-1}; map<LL,LL>mp[25][25]; void dfs1(int x,int y,int step,LL sum) {if(!step) {mp[x][y][sum]++;//到了x,y的值return;}for(int i=0;i<2;i++){int tempx=x+dx1[i],tempy=y+dy1[i];if(tempx<1||tempx>n||tempy<1||tempy>m) continue;dfs1(tempx,tempy,step-1,sum^a[tempx][tempy]);} } void dfs2(int x,int y,int step,LL sum) {if(!step){if(mp[x][y].count(sum^k)) ans+=mp[x][y][sum^k];return ;}sum=sum^a[x][y];//后異或,目的是到了結束的時候是到(x,y)位置前的值,這樣看好是碰面了,不會記錄重復的值for(int i=0;i<2;i++){int tempx=x+dx2[i],tempy=y+dy2[i];if(tempx<1||tempx>n||tempy<1||tempy>m) continue;dfs2(tempx,tempy,step-1,sum);} } int main(void) {cin>>n>>m>>k;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) cin>>a[i][j];int step=n-1+m-1;//總的步數dfs1(1,1,step/2,a[1][1]);//從右到下搜dfs2(n,m,step-step/2,0);//從左到上搜cout<<ans<<endl;return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Codeforces Round #498 (Div. 3)【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

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