Codeforces Round #656 (Div. 3)
A.Three Pairwise Maximums
首先最大的在原序列中肯定出現至少兩次否則不能構造,即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了一次(數組開小了我🤮了)
#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
看數據范圍,對于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
昨天晚上打完比賽后,躺在床上就想這個題,突然靈光一現,發現只需要搞個拓撲排序就行了。今天早上起晚了,醒了就趕快寫了一下發現漂亮的AC了。
先不考慮無向邊,對有向邊進行拓撲排序,如果有向邊不是拓撲序那么答案肯定是YES否則答案肯定是NO,對于不考慮無向邊的拓撲序肯定是一些拓撲序,只要對無向邊從拓撲序前面向拓撲序后面連邊,肯定不會出現環。對于兩個獨立的拓撲序,也可以按照上述方式連邊。
之前每次都是補五題,不過這次的五題可以算是自己獨立做出來的(雖然E)所以有時間可以把F、G看看題解更新一下。要加油哦~
F - Removing Leaves
①維護leaf[i]表示與第i個節點相鄰葉子(度數為1)的數量
②維護s[i]表示與第i個節點相鄰并且不是葉子節點的編號(用STL中的set記錄
③優先隊列維護leaf[],按照每個節點的葉子數量排序(葉子節點多的優先級高)
每次取出對頭,只要能一次刪除k個就刪除并統計答案同時更新每個點的度數和相鄰葉子數量,倘若一個點t的leaf[t]==0&&d[t]==1說明該點在刪除自己之前的葉子節點后自己變成了葉子節點,那么要更新s[t]中節點的葉子數量(這時候s[t]中有且只有一個節點v),t已經成了葉節點所以需要s[v].erase(t),然后加入隊列循環此過程。
總結
以上是生活随笔為你收集整理的Codeforces Round #656 (Div. 3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑硬盘数据丢了怎么恢复电脑如何恢复硬盘
- 下一篇: Win11 学院:在 Windows 1