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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #656 (Div. 3)

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #656 (Div. 3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

A.Three Pairwise Maximums

首先最大的在原序列中肯定出現(xiàn)至少兩次否則不能構(gòu)造,即min max max,對于答案min min max肯定滿足題意

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){int x,y,z;cin>>x>>y>>z;if(x>y) swap(x,y);if(y>z) swap(y,z);if(x>y) swap(x,y);if(z!=y) cout<<"NO"<<endl;else {cout<<"YES"<<endl;cout<<x<<" "<<x<<" "<<y<<endl;}}return 0; }

B. Restore the Permutation by Merger

第二題直接開個map記錄一下就行了。最氣的是wa了一次(數(shù)組開小了我🤮了)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=60;//最開始N=50 wa了一次,這種低級錯誤我🤮了 int mp[N],n; int main() {IO;int T;cin>>T;while(T--){memset(mp,0,sizeof mp);cin>>n;for(int i=1;i<=2*n;i++){int a;cin>>a;if(mp[a]) continue;mp[a]=1;cout<<a<<" ";}cout<<endl;}return 0; }

C. Make It Good

這題就是從后往前找^就行了。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=200010; int a[N],n; int main() {IO;int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int i=n;for(;i;i--)if(a[i]>a[i-1]) break;int j=i;for(;j;j--) if(a[j]<a[j-1]) break;if(j==0) cout<<j<<endl;else cout<<j-1<<endl;}return 0; }

D. a-Good String

看數(shù)據(jù)范圍,對于216=655362^{16}=65536216=65536所以直接暴力就行了,分而治之。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<string> using namespace std; const int N=200010; int n; string s; int res=0x3f3f3f3f; void dfs(int l,int r,int x,int ans) {if(ans>=res) return;if(r==l){if(s[l]!=char('a'+x)) ans++;res=min(res,ans);}int mid=l+r>>1;int cnt1=0,cnt2=0;for(int i=l;i<=mid;i++)if(s[i]!=char('a'+x)) cnt1++;dfs(mid+1,r,x+1,ans+cnt1);for(int i=mid+1;i<=r;i++)if(s[i]!=char('a'+x)) cnt2++;dfs(l,mid,x+1,ans+cnt2); } int main() {IO;int T;cin>>T;while(T--){cin>>n;cin>>s;res=0x3f3f3f3f;dfs(0,n-1,0,0);cout<<res<<endl;}return 0; }

做了上面四個題,比之前多做一題。-。-還是太菜

E.Directing Edges

昨天晚上打完比賽后,躺在床上就想這個題,突然靈光一現(xiàn),發(fā)現(xiàn)只需要搞個拓撲排序就行了。今天早上起晚了,醒了就趕快寫了一下發(fā)現(xiàn)漂亮的AC了。
先不考慮無向邊,對有向邊進行拓撲排序,如果有向邊不是拓撲序那么答案肯定是YES否則答案肯定是NO,對于不考慮無向邊的拓撲序肯定是一些拓撲序,只要對無向邊從拓撲序前面向拓撲序后面連邊,肯定不會出現(xiàn)環(huán)。對于兩個獨立的拓撲序,也可以按照上述方式連邊。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; typedef pair<int,int> pii; const int N=200010,M=400010; int n,m; int h1[N],h2[N],e[M],ne[M],idx; bool st[N]; int cnt; vector<pii> res; void add(int h[],int a,int b) {e[idx]=b;ne[idx]=h[a];h[a]=idx++; } int q[N],d[N]; bool top_sort() {int tt=-1,hh=0;for(int i=1;i<=n;i++)if(!d[i]) q[++tt]=i;while(tt>=hh){int t=q[hh++];st[t]=1;for(int i=h2[t];i!=-1;i=ne[i]){int j=e[i];if(st[j]) continue;res.push_back({t,j});}for(int i=h1[t];i!=-1;i=ne[i]){int j=e[i];if(!(--d[j])) q[++tt]=j;}}return tt==n-1; } int main() {IO;int T;cin>>T;while(T--){memset(h1,-1,sizeof h1);memset(h2,-1,sizeof h2);memset(st,0,sizeof st);memset(d,0,sizeof d);idx=0,cnt=0;res.clear();cin>>n>>m;for(int i=0;i<m;i++) {int t,x,y;cin>>t>>x>>y;if(t) {res.push_back({x,y});add(h1,x,y);d[y]++;}else {add(h2,x,y);add(h2,y,x);}}if(!top_sort()) cout<<"NO"<<endl;else{cout<<"YES"<<endl;for(auto t:res) cout<<t.first<<" "<<t.second<<endl;}}return 0; }

之前每次都是補五題,不過這次的五題可以算是自己獨立做出來的(雖然E)所以有時間可以把F、G看看題解更新一下。要加油哦~

F - Removing Leaves

①維護leaf[i]表示與第i個節(jié)點相鄰葉子(度數(shù)為1)的數(shù)量
②維護s[i]表示與第i個節(jié)點相鄰并且不是葉子節(jié)點的編號(用STL中的set記錄
③優(yōu)先隊列維護leaf[],按照每個節(jié)點的葉子數(shù)量排序(葉子節(jié)點多的優(yōu)先級高)
每次取出對頭,只要能一次刪除k個就刪除并統(tǒng)計答案同時更新每個點的度數(shù)和相鄰葉子數(shù)量,倘若一個點t的leaf[t]==0&&d[t]==1說明該點在刪除自己之前的葉子節(jié)點后自己變成了葉子節(jié)點,那么要更新s[t]中節(jié)點的葉子數(shù)量(這時候s[t]中有且只有一個節(jié)點v),t已經(jīng)成了葉節(jié)點所以需要s[v].erase(t),然后加入隊列循環(huán)此過程。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<set> #include<queue> using namespace std; const int N=200010,M=400010; int h[N],e[M],ne[M],idx,d[N]; int n,m; int leaf[N];//每個點相鄰葉子節(jié)點的數(shù)量 set<int> s[N];//每個點相鄰不是葉子節(jié)點 struct node {int id,cnt;bool operator < (const node &o) const{return cnt<o.cnt;} }; priority_queue<node> heap; void add(int a,int b) {e[idx]=b;ne[idx]=h[a];h[a]=idx++;d[b]++; } void init() {for(int i=0;i<=n;i++){s[i].clear();h[i]=-1;d[i]=0;leaf[i]=0;}while(heap.size()) heap.pop();idx=0; } void dfs(int u,int fa) {for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue; //由于邊是雙向的,需要雙向加!!!//d[]>1說明不是葉子節(jié)點 d[]==1說明是葉子節(jié)點if(d[j]>1) s[u].insert(j); if(d[u]>1) s[j].insert(u);if(d[j]==1) leaf[u]++;if(d[u]==1) leaf[j]++;dfs(j,u);} } int main() {IO;memset(h,-1,sizeof h);int T;cin>>T;while(T--){init();cin>>n>>m;for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}if(m==1){cout<<n-1<<endl;continue;}dfs(1,-1);for(int i=1;i<=n;i++)if(leaf[i]>=m) heap.push({i,leaf[i]});int res=0;while(heap.size()){if(heap.top().cnt!=leaf[heap.top().id]) {heap.pop();continue;}int t=heap.top().id;heap.pop();if(leaf[t]<m) break;else {res+=leaf[t]/m;d[t]-=leaf[t]/m*m;leaf[t]%=m;if(leaf[t]==0&&d[t]==1){int v=*s[t].begin();leaf[v]++;s[v].erase(t);if(leaf[v]>=m) heap.push({v,leaf[v]});}}}cout<<res<<endl;}return 0; }

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。