【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;
}

posted @ 2025-04-06 01:48  MNNUACM_2024ZY  阅读(150)  评论(0)    收藏  举报