【CodeForces训练记录】Codeforces Round 1007 (Div. 2)

训练情况

赛后反思

放假降智了,逆天卡 A 题,还 WA 了一发,放假就会掉大分 TAT

A题

打表易得结论,直接手动枚举几个,发现有循环节,第 \(1,4,7,\cdots\) 可以为观众,其他都不可以

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int x; cin>>x;
    if((x-1) % 3 == 0) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

发现自己乱搞做出来了,预处理一下完全平方数,我们构造一个 2 1 3 4 5 6 ... 这种数列,再求一次前缀和,如果前缀和为完全平方数,则当前位与下一位交换,会让前缀和多个 1,无解情况就是排列之和为完全平方数,这种情况无论如何排列最后一位前缀和都是完全平方数,直接输出 -1 即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

const int N = 1e12;

map<int,int> v;

void pre(){
    for(int i = 1;i*i<=N;i++) v[i*i] = 1;
}

void solve(){
    int n; cin>>n;
    if(n == 1 || v[(1ll+n)*n/2]){
        cout<<-1<<endl;
        return;
    }
    vector<int> a(n + 1),p(n + 1);
    a[1] = 2;
    a[2] = 1;
    for(int i = 3;i<=n;i++) a[i] = i;
    for(int i = 1;i<=n;i++) p[i] = p[i-1] + a[i];
    for(int i = 1;i<=n;i++){
        if(i<n&&v[p[i]]){
            swap(a[i],a[i+1]);
        }
    }
    for(int i = 1;i<=n;i++) cout<<a[i]<<" ";
    cout<<endl;
}

signed main(){
    pre();
    int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @   MNNUACM_2024ZY  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示