训练情况
赛后反思
开局连WA就知道这把完蛋了,应该要掉大分了,A题没考虑清楚,B题犯傻了一时间没看出来结论
A题
当且仅当两个人贴贴的时候,轮到谁走谁就输,后手可以把先手逼到两边,如果两人之间有一段距离,两人都必须往中间靠,如果两个人都往同一边走距离不变为无效操作,所以两人的距离为奇数的时候不存在先手必胜,两人的距离为偶数的时候先手必胜
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n,a,b; cin>>n>>a>>b;if(abs(a-b)%2==1) cout<<"NO"<<endl;else cout<<"YES"<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
B题
我们只能选择一个位置进行操作,若选择了两个及其以上的位置是无效操作。
例如
+1 -1 -1 -1 -1
-1 -1 -1 -1 + 1
最后的贡献为
0 -2 -2 -2 0
例如
+2 -2 -2 -2 -2
-1 -1 -1 -1 +1
最后的贡献为
+1 -3 -3 -3 -1
不如只选第一个操作
综上我们只要枚举操作哪一个位置即可,如果已经全部 \(>b_i\) 则为 YES,否则需要进一步判断,判断枚举那个位置之外的元素是否在操作后能满足要求即可。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;vector<int> a(n + 1),b(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 1;i<=n;i++) cin>>b[i];int ans = 0;int pos = 0;int now = 0;for(int i = 1;i<=n;i++){if(a[i]<b[i]) now=b[i]-a[i],pos=i,ans++;}bool flag = true;for(int i = 1;i<=n;i++){if(i==pos) continue;if(a[i]-now<b[i]) flag = false;}if(ans==0||(ans==1&&flag)) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}