Codeforces Round #395 (Div. 2)
今天自己模拟了一套题,只写出两道来,第三道时间到了过了几分钟才写出来,啊,太菜了。
A. Taymyr is calling you
水题,问你在z范围内 两个序列 n,2*n,3*n...... 和 m,2*m,3*m.....有多少个是一样的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; int res=now; while(res<=z) { ans++; res+=now; } cout<<ans<<endl; return 0; }
B. Timofey and cubes
题目大意:给你n个数,进行(n/2)次操作,每次操作将制定区间里的数交换,给你交换后的
让你求原来的。
思路:水题,奇偶讨论。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> const int N=2*1e5+5; using namespace std; int a[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两次就行了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
D. Timofey and rectangles
题目大意:给你n个矩形,且矩形的边长为奇数,任意两个矩形都不相交,最多相邻,现在让你给这些矩形上色,
一种4种颜色,相邻的矩形颜色不能相等,问你有没有这样的方案,如果有则输出。
思路:赤裸裸的脑洞题,专门碾压我这种低智商的,这题最关键的是矩形的边长是奇数,虽然我知道,但是
我还是不会写QAQ。
首先,四个矩形不可能两两互相相邻,所以结论一定是YES
然后,我们考虑矩形的左下角的顶点,如果 x 和 y 的值都为奇数,因为边长是奇数,所以这个矩形不可能和
另一个左下角坐标都为奇数的矩形相邻。所以我们给这类矩形染色 1 。
其他三种同理。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }