【CodeForces训练记录】Teza Round 1 (Codeforces Round 1015, Div. 1 + Div. 2)
训练情况

赛后反思
事实证明人在急了的情况下什么都能做得出来,D题狂暴WA1十二发,在数论方面个人短板的debuff情况下两个小时三发硬搓出了B题,虽然很简单的结论题,但还是第一次自己独立证明出来了
A题
显然我们从第二位开始考虑取模后的结果,显然我们要求的是排列,显然不能大于 \(i\),所以我们只能在小于 \(i\) 的值域去找取模结果为 \(i-1\),显然第二位开始就是 \(1 \sim n-1\),接下来我们只要考虑第一位对 \(i=2\) 的影响,显然偶数情况 \(= 0\) 无解,奇数直接输出 \(n,1,2,3,\cdots,n-1\) 即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int x; cin>>x;
if(x&1){
cout<<x<<" ";
for(int i = 1;i<x;i++) cout<<i<<" ";
cout<<endl;
} else {
cout<<-1<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}
B题
经过前面某场的毒打后我知道了 \(\gcd(a,b) \le \min(a,b)\) 的性质,总之 \(\gcd\) 操作出来是不增的,对于数列左边一坨最小值=右边一坨的gcd,\(gcd \le min\),所以右边一坨的最小值一定要大等于左边一坨的最大值,所以容易想到从小到大排序,因为小的数一定在左边,大的数一定在右边,所以对于小的数,一定存在左边一坨的min一定等于数列中最小的数,所以我们只要找其他数是否能 gcd 出那个最小的数即可,所以我们找其余是它的倍数的数,全部 gcd 一遍再比较是否相等即可
点击查看代码
#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);
for(int i = 1;i<=n;i++) cin>>a[i];
sort(a.begin() + 1,a.end());
int g = 1;
for(int i = 2;i<=n;i++){
if(a[i]%a[1] == 0){
g = a[i];
break;
}
}
for(int i = 2;i<=n;i++){
if(a[i]%a[1] == 0){
g = __gcd(a[i],g);
}
}
// cout<<g<<endl;
if(g == a[1]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}
C题
我们发现 \(a_i = b_{n-i+1}\) 的情况,我们竖着看,即左边的 \(a,b\) 要和右边的 \(b,a\) 相等,因为交换操作 \(a_i\) 和 \(b_i\) 之间的相对位置不会改变,我们使用 map 维护位置,接下来就是求两个数对换所在的位置给它换成 \(n-i+1\) 即可,注意一下特判当 \(a=b\) 的时候,这种情况要扔到中间
点击查看代码
#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];
vector<pair<int,int>> q;
for(int i = 1;i<=n;i++){
if(a[i] == b[i]){
if(i == n/2+1) continue;
swap(a[i],a[n/2+1]);
swap(b[i],b[n/2+1]);
q.push_back({i,n/2+1});
}
}
map<pair<int,int>,int> v;
for(int i = 1;i<=n;i++) v[{a[i],b[i]}] = i;
for(int i = 1;i<=n/2;i++){
int p = v[{b[i],a[i]}];
if(p == 0 || p == n-i+1) continue;
int tmp = v[{a[p],b[p]}];
v[{a[p],b[p]}] = v[{a[n-i+1],b[n-i+1]}];
v[{a[n-i+1],b[n-i+1]}] = tmp;
q.push_back({p,n-i+1});
swap(a[p],a[n-i+1]);
swap(b[p],b[n-i+1]);
}
for(int i = 1;i<=n;i++){
if(a[i] != b[n-i+1]){
cout<<-1<<endl;
return;
}
}
cout<<q.size()<<endl;
for(auto i:q){
cout<<i.first<<" "<<i.second<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号