• Codeforces Round #836 (Div. 2)



    一、 A - SSeeeeiinngg DDoouubbllee

    • 代码:
    #include 
    #define ios ios::sync_with_stdio(0),cin.tie(0)
    #define fi first
    #define se second
    #define pb push_back
    #define PII pair<int,int>
    #define int long long
    using namespace std;
    
    const int N = 1e7 + 1,M = N * 2,INF = 0x3f3f3f3f,mod = 998244353;
    int a[N],b[N];
    
    void solve()
    {
        string s,res; cin >> s;
        
        for(int i = s.size() - 1;i >= 0;i --)
        res += s[i];
        s += res;
        
        cout << s << endl;
    
    }
    
    signed main()
    {
        ios;
        int T = 1;cin >> T;while(T -- ) solve();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    二、B - XOR = Average

    • 思路: 构造,如果n是奇数那就全部为1就好,否则偶数输出 1 3 其他全部为2
    • 代码:
    #include 
    #define ios ios::sync_with_stdio(0),cin.tie(0)
    #define fi first
    #define se second
    #define pb push_back
    #define PII pair<int,int>
    #define int long long
    using namespace std;
    
    const int N = 1e7 + 1,M = N * 2,INF = 0x3f3f3f3f,mod = 998244353;
    int a[N],b[N];
    int n;
    void solve()
    {
        cin >> n;
        if(n == 1) cout << "1" << endl;
        else
        {
            if(n & 1)
            {
                for(int i = 1;i <= n;i ++ ) cout << "1" << ' ';
                cout << endl;
            }
            else
            {
                if(n == 2)
                {
                    cout << "1 3" <<endl;
                }
                else
                {
                    cout << "1 2 3" << ' ';
                for(int i = 1;i <= n - 3;i ++ ) cout << "2" << ' ';
                cout << endl;
                }
                
            }
    
        }
    }
    
    signed main()
    {
        ios;
        int T = 1;cin >> T;while(T -- ) solve();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    三、C - Almost All Multiples

    • 思路:
      1 如果 x = n 的话,就直接按照顺序输出就行
      2 输出**-1** 的情况是 n % x != 0,因为 数字1占了 位置 n, 数字x占了 位置 1,所以最差也就是 数字 n 必须占 位置 x
      3 其他情况: ,让 x 这个位置 上面 的 数字 尽可能小,那比如 x = 6,n = 72, n 必须要占用前面的位置,可以转移的有很多比如
      6 12 24 72 6 18 36 72…等等,为了保证字典序最小,我们就分解质因数 n / x,这里面 n / x = 12,12分解质因数就是 2 2 3,就选用让 x * 2占用x的位置,然后其他位置补上去就行
    • 代码:
    #include 
    #define ios ios::sync_with_stdio(0),cin.tie(0)
    #define fi first
    #define se second
    #define pb push_back
    #define PII pair<int,int>
    #define int long long
    using namespace std;
    
    const int N = 2e5 + 1000,M = N * 2,INF = 0x3f3f3f3f,mod = 998244353;
    int ans[N];
    
    int p[N];
    bool st[N];
    vector<int> res2;
    int cnt;
    
    void prime(int x)
    {
        int res=0;
        for(int i=2;i<=x;i++)
        {
            if(!st[i])
            {
                p[cnt++]=i;
            }
            for(int j=0;p[j]<=x/i;j++)
            {
                st[p[j]*i]=true;
                
                if(i%p[j]==0)break;
            }
              
        }
    }
     
    void check(int x)
    {
      
        for(int i = 2;i * i <= x ;i ++ )
        {
            if(x % i == 0)
            {
                while(x % i == 0)
                {
                    x /= i;
                    res2.pb(i);
                }
                
            }
            
            if(x == 1) break;
             
        }
        
        if(x != 1) res2.pb(x);
         
    }
    
    void solve()
    {
        int n,x;
        cin >> n >> x;
        res2.clear();
        if(x == n)
        {
            cout << x << ' ';
            for(int i = 2;i <= n - 1;i ++ )
            cout << i <<' ';
            
            cout << "1" << endl;
        }
        else
        {
            
            if(n % x != 0) cout << "-1" << endl;
            else
            {
               // 只有x这个位置需要变化
               int w = n;
                
                for(int i = 2;i <= n - 1;i ++ )
                 ans[i] = i;
                 
                 int k = n / x;
                 
                 check(k);
                
             //  for(auto o:res2) cout << o << ' ';
               cout << x << ' ';
              for(int i = res2.size() - 1;i >= 0;i -- )
              {
                  ans[w / res2[i]] = w;
                  w /= res2[i];
              }
               
               
              for(int i = 2;i <= n - 1;i ++ )
                cout << ans[i] << ' ';
               
                cout << "1" <<endl;
             }
            
        }
        
    }
    
    signed main()
    {
        ios;
        int T = 1;cin >> T;while(T -- ) solve();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

    四、D - Carry Bit

    • 思路:
    • 原来的式子开平方,max(a1,a2,…an) - (a1,a2,…an)的平方 = (a1 + a2 + a3 + a4 + an) / n;这里让max(a1,a2,…an) - (a1,a2,…an) = n + 1,然后枚举左右端点,问题转化成了你可以在 [L+ 1,R - 1]范围里面选择 (n - 2)个数字,使得他们的和为 sum = (n +1) * (n + 1) - L - R,
    • 这里面因为每一个数字都不相同,所以对于每一段区间我们都可以知道这段区间最大值和最小值,因为只能选(n - 2)个数字,所以最大值就是 (R - 1) + (R - 2) + … (R - (n - 2) ) ,最小值就是 (L + 1) + (L + 2) + … (L + (n - 2)),如果 sum 处于这个区间,那左右端点就确定了
    • 因为区间很大,我们只能选n - 2个数字,所以从(L + 1)到 (R - 1)枚举每一数字,判断这个数字是否可以用,具体代码里面有如何判断
    • 代码:
    #include 
    #define ios ios::sync_with_stdio(0),cin.tie(0)
    #define fi first
    #define se second
    #define pb push_back
    #define PII pair<int,int>
    #define int long long
    using namespace std;
    
    const int N = 2e5 + 1000,M = N * 2,INF = 0x3f3f3f3f,mod = 998244353;
    
    void solve()
    {
        int n; cin >> n;
        if(n == 2) // 特判
        {
            cout << "1 3" << endl;
            return;
        }
        int k = (n + 1) * (n + 1);
    
        for(int l = 1;l <= n;l ++ )
        {
            int r = 1 + n + l;
          
            int le = (l + n - 2) * (l + n - 1) / 2 - l * (l + 1) / 2; // 等差数列求和
            int ri = r * (r - 1) / 2 - (r - n + 1) * (r - n + 2) / 2; // 等差数列求和
           
            
            if((k - r - l) >= le && (k - r - l) <= ri)
            {
                cout << l << ' ';
                
                int s = k - r - l;
                int d = n - 2; // 最多选d个数字
                 for(int i = l + 1;i <= r - 1;i ++ ) // 判断该数字是否可用,如果可用的话,那剩下的必须选择的数字的和也一定要在新的范围内
                  {
                    if(d == 0) break;
                    
                    int w = s - i; //如果选i的话,剩下的和
                    int d1 = d - 1;// 剩下的个数
                    int ll =(i + d1) * (i + d1 + 1) / 2 - i * (i + 1) / 2,rr = (r - 1) * (r) / 2 - (r - 1 - d1) *(r - 1 - d1 + 1) / 2;
                    if(w >= ll && w <= rr) // 必须在该范围内
                    {
                        cout << i << ' ';
                        s = w;
                        d = d1;
                    }
                    
                    
                 }
                cout << r << endl;
                break;
            }
        }
        
        
    }
    
    signed main()
    {
        ios;
        int T = 1;cin >> T;while(T -- ) solve();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    总结

    这此打的不好,脑溢血了,c题那个求质因数的函数,因为懒没有自己写,而是用了以前写过的那个,谁知道以前写的那个不对,一直在调试,重点:不要懒还有 d 题,判断数字是否可用的时候,我已经通过样例知道 写的有问题,但是我以为就4一个特殊的,然后就没继续想,然后就wa了,真的别懒

  • 相关阅读:
    @RestControllerAdvice 统一异常处理
    后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题
    OpenAI新模型发布,免费开放GPT-4o!但只开放一点点...
    通用环形缓冲区 LwRB 使用指南
    30天学习之-自动化测试
    JSON.parse()和JSON.stringify()的使用
    抖店都需要什么费用?2024具体费用标准,新手必看!
    线上研讨会 | CATIA助力AI提升汽车造型设计
    洗牌进行时!激光雷达上车背后
    C++:多态 详解
  • 原文地址:https://blog.csdn.net/weixin_52255583/article/details/128056051