Codeforces Round 885 (Div. 2)
Codeforces Round 885 (Div. 2)
A - Vika and Her Friends
思路:移动后再判断,所以距离为奇数时朋友永远抓不到她
#include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7; const double eps=1e-6; void solve(){ int n,m,k;cin>>n>>m>>k; int x,y; bool ok=true; cin>>x>>y; for(int i=0,a,b;i<k;++i){ cin>>a>>b; int c=abs(x-a)+abs(y-b); if(c%2==0)ok=false; } if(ok)cout<<"YES\n"; else cout<<"NO\n"; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; //init(); cin>>t; while(t--){ solve(); } return 0; }
B - Vika and the Bridge
思路:记录走每种颜色需要的步数,将步数排序后,把最大的步数除二即为最优情况,答案即为max(最大步数除二,第二大),取最小的答案
#include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7; const double eps=1e-6; bool cmp(int a,int b){ return a>b; } void solve(){ int k,n;cin>>n>>k; vector<int>pre(k+1,0); vector<int>c[k+1]; for(int i=1,x;i<=n;++i){ cin>>x; int d=i-pre[x]-1; if(d){ c[x].push_back(d); } pre[x]=i; } int ans=n; for(int i=1;i<=k;++i){ int d=n-pre[i]; if(d)c[i].push_back(d); if(c[i].size()==0){ ans=0;break; } if(c[i].size()>1)sort(c[i].begin(),c[i].end(),cmp); int x=c[i][0]/2; if(c[i].size()>1)x=max(x,c[i][1]); ans=min(ans,x); } cout<<ans<<'\n'; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; //init(); cin>>t; while(t--){ solve(); } return 0; }
C - Vika and Price Tags
题意:给n对(ai,bi),每对的操作过程:(a,b)→(b,abs(a-b))→(abs(a-b),abs(b-abs(a-b)))→....,问是否能对每对(a,b)操作同样次数后,所有的ai变为0,有则YES。
思路:对于任意(a,b)都可以转换到0,比较每一对(ai,bi)转换到0的次数即可。
从: 1 3 2 1 1 0 1 1 0 ....
2 6 4 2 2 0 2 2 0 ....
可以发现(a,b)、(2a,2b)...(ka,kb)转换到0的过程中的数也是成k倍比列的,且转边到0的次数相等,所以先将所有(a,b)化为最简。
化简后的(a,b)有三种情况:(奇,偶)、(偶,奇)、(奇,奇)。
三者的关系为:(奇,偶)→(偶,奇)→(奇,奇)→(奇,偶).....,变为(x,0),而后也是循环三次又变为(x,0)
那么只需要判断每一对(ai,bi)是否属于一种情况即可。
特判(0,0),不管怎么转换都为(0,0)。
#include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7; const double eps=1e-6; void solve(){ int n;cin>>n; vector<int>a(n+1),b(n+1); for(int i=0;i<n;++i)cin>>a[i]; for(int i=0;i<n;++i){ cin>>b[i]; if(a[i]||b[i]){ int c=__gcd(a[i],b[i]); a[i]/=c,b[i]/=c; } } int pa=-1,pb=-1; for(int i=0;i<n;++i){ if(a[i]==0&&b[i]==0)continue; if(pa!=-1&&pb!=-1&&(a[i]%2!=pa||b[i]%2!=pb)){ cout<<"NO\n";return; } if(pa==-1&&pb==-1&&(a[i]||b[i])){ pa=a[i]%2,pb=b[i]%2; } } cout<<"YES\n";return ; return ; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; //init(); cin>>t; while(t--){ solve(); } return 0; }