Codeforces Round #395 (Div. 2)
今天自己模擬了一套題,只寫出兩道來,第三道時間到了過了幾分鐘才寫出來,啊,太菜了。
A. Taymyr is calling you
水題,問你在z範圍內 兩個序列 n,2*n,3*n...... 和 m,2*m,3*m.....有多少個是一樣的。
#include<bits/stdc++.h> using namespace std; int n,m,z; int main() { cin>>n>>m>>z; int gcd=__gcd(n,m); int now=n*m/gcd; int ans=0;View Codeint res=now; while(res<=z) { ans++; res+=now; } cout<<ans<<endl; return 0; }
B. Timofey and cubes
題目大意:給你n個數,進行(n/2)次操作,每次操作將制定區間裏的數交換,給你交換後的
讓你求原來的。
思路:水題,奇偶討論。
#include<bits/stdc++.h> const int N=2*1e5+5; using namespace std; intView Codea[N]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); int mid=n/2; int i=1,j=n; bool flag=true; while(i<=j) { if(flag) { int t=a[i]; a[i]=a[j]; a[j]=t; } flag=!flag; i++,j--; } for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n? ‘\n‘:‘ ‘); return 0; }
C. Timofey and a tree
題目大意:給你一顆樹,每個節點都有一個顏色,讓你挑選一個節點當做整棵樹的根,滿足所有
子樹中節點的顏色都是一樣的。如果沒有輸出NO 否則輸入YES 且輸出選擇的節點。
思路:剛開始的思路是我覺得這棵樹中的顏色不能超過 3 種,後來一想這種想法好智障啊,明顯
不對,後來枚舉樹根每個都dfs一下超時,結束後想我隨便找一個點dfs找到兩個相鄰的顏色不同的
點,那麽這兩個點中間肯定有一個要當做樹根的,否則不成立。這樣只要dfs兩次就行了。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; vector<int> e[N]; int c[N],item1,item2,n; map<int,bool> mp; bool flag; void dfs1(int u,int pre) { //printf("%d\n",u); if(pre!=-1 && c[u]!=c[pre]) { item1=u; item2=pre; return; } for(int i=0;i<e[u].size();i++) { int to=e[u][i]; if(to!=pre) dfs1(to,u); if(item1!=-1) return; } } void dfs(int u,int pre,int item) { // printf("%d %d %d**\n",u,pre,item); if(pre!=item && pre!=-1 && c[u]!=c[pre]) { flag=false; return; } for(int i=0;i<e[u].size();i++) { int to=e[u][i]; if(to!=pre) dfs(to,u,item); if(!flag) return; } } int main() { cin>>n; for(int i=1;i<n;i++) { int f,t; scanf("%d%d",&f,&t); e[f].push_back(t); e[t].push_back(f); } int cnt=0; for(int i=1;i<=n;i++) scanf("%d",&c[i]); item1=-1,item2=-1; dfs1(1,-1); if(item1==-1) { puts("YES"); puts("1"); return 0; } flag=true; dfs(item1,-1,item1); if(flag) { puts("YES"); printf("%d\n",item1); return 0; } flag=true; dfs(item2,-1,item2); if(flag) { puts("YES"); printf("%d\n",item2); return 0; } puts("NO"); return 0; }View Code
D. Timofey and rectangles
題目大意:給你n個矩形,且矩形的邊長為奇數,任意兩個矩形都不相交,最多相鄰,現在讓你給這些矩形上色,
一種4種顏色,相鄰的矩形顏色不能相等,問你有沒有這樣的方案,如果有則輸出。
思路:赤裸裸的腦洞題,專門碾壓我這種低智商的,這題最關鍵的是矩形的邊長是奇數,雖然我知道,但是
我還是不會寫QAQ。
首先,四個矩形不可能兩兩互相相鄰,所以結論一定是YES
然後,我們考慮矩形的左下角的頂點,如果 x 和 y 的值都為奇數,因為邊長是奇數,所以這個矩形不可能和
另一個左下角坐標都為奇數的矩形相鄰。所以我們給這類矩形染色 1 。
其他三種同理。
#include<bits/stdc++.h> using namespace std; const int N=5*1e5+5; int n,vis[N],m=1e9; int main() { cin>>n; for(int i=1;i<=n;i++) { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if((x1+m)%2 && (y1+m)%2) vis[i]=1; else if((x1+m)%2) vis[i]=2; else if((y1+m)%2) vis[i]=3; else vis[i]=4; } cout<<"YES"<<endl; for(int i=1;i<=n;i++) printf("%d\n",vis[i]); return 0; }View Code
Codeforces Round #395 (Div. 2)