Educational Codeforces Round 76 (Rated for Div. 2)
A. Two Rival Students
题目大意为:给定一个长度为n的序列并指定a元素b元素再在序列里的位置,你可以操作x次,求操作完成后a和b的最大距离
#include <iostream> #include <algorithm> #include <cmath> using namespace std; int t,n,x,a,b; int main() { scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&x,&a,&b); printf("%d\n",min(n-1,x+abs(b-a))); } }
B. Magic Stick
题目大意:给定两个数a和b并定义两个操作。操作一:如果a>1,那么a就可以不断-1 操作二:如果a是偶数,则可以变成二分之三a 问a经过任意顺序任意次数操作和可否变成b
分析:由于a和b都是大于1的正整数 故当a>=b时 不操作或通过不断-1操作最终可以变为b。当a<b时 若a>=4那他就可以不断乘二分之三完成倍增或先减去1再进行倍增最终与b相等。
当a=2时乘上二分之三是3无法倍增,减1倍增后发现始终循环,故需要特判。
#include <iostream> #include <algorithm> using namespace std; int t; int a,b; int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); if(a>=b) printf("YES\n"); else if(a<b&&a>=4) printf("YES\n"); else if(a==2&&b==3) printf("YES\n"); else printf("NO\n"); } }
C. Dominated Subarray
题意:求一段最小的子区间使得只有一个数的个数为2
#include <iostream> #include <algorithm> #include <cstring> #include <set> using namespace std; const int N=200100,INF=0x3f3f3f3f; int a[N]; set<int>s; int n,ans; int pos[N]; int main() { int t; cin>>t; while(t--) { s.clear(); memset(pos,0,sizeof(pos)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; ans=INF; for(int i=1;i<=n;i++) { if(s.count(a[i])==1) { ans=min(ans,i-pos[a[i]]+1); pos[a[i]]=i; continue; } s.insert(a[i]); pos[a[i]]=i; } if(ans==INF) cout<<-1<<endl; else cout<<ans<<endl; } }