Codeforces Round #836 (Div. 2)

 哇塞,究极构造场,abcd四道构造可真行

A. SSeeeeiinngg DDoouubbllee

A. SSeeeeiinngg DDoouubbllee

题意

        给一个字符串,将字符串的每个字母变成两个(codeforce --> ccooddeeffoorrccee),随后重新排列该字符串,构成一个回文串,输出这个回文串。

思路

        一遍正的一遍反的不就好了。。 反正是随便排列。。。

Code

#include<bits/stdc++.h>
using namespace std;
void solve()
{
    string s;
    cin >> s;
    string t = s;
    reverse(s.begin(),s.end());
    cout << t + s << endl;
}
int main()
{
    int tt;
    cin >> tt;
    while(tt --)
        solve();
    system("pause");
}

 B. XOR = Average

B. XOR = Average

 题意

        构造一个长度为n的数组,使得该数组的异或和等于该数组的平均数

思路

        首先想到奇数个相同的数异或起来还是这个数,而一个数组如果所有数都相同那平均数也等于这个数,奇数的情况就非常ez。

        接下来沿用这个思路去构造偶数,能否使得偶数个数的异或和等于奇数个相同数的异或和呢,想到1异或3 = 2,我们可以构造一个数组为1 3 2 2 2 2....,刚好这个数组的平均数也等于2,over。

Code

#include<bits/stdc++.h>
using namespace std;
void solve()
{
    int n;
    cin >> n;
    if(n % 2 == 0)
    {
        if(n == 1) cout << 1 << endl;
        else
        {
            cout << 1 << " " << 3 << " ";
            for(int i = 1;i <= n - 2;i ++)
                cout << 2 << " \n"[i == n - 2];
        }
        
    }
    else
        for(int i = 1;i <= n;i ++) 
            cout << 2  << " \n"[i == n];
}
int main()
{
    int tt;
    cin >> tt;
    while(tt --)
        solve();
    system("pause");
}

 C. Almost All Multiples

C. Almost All Multiples

题意

        构造一个长度为n的序列p,满足p1 = x,pn = 1,且对于所有的i(1< i < n)满足i | pi,输出构造的序列,无法构造输出 -1

思路

        哪来那么多构造题啊(恼)

        手模几组,会发现我们实际上是在第x位放x的倍数,在x的倍数位放x的倍数的倍数,直到把n放下来,也就是说n必须整除x,同时去找一个最长的序列a,满足n | a1 | a2 | a3...,为了构造这个序列我们分解n / x的质因数作为倍数,然后模拟即可。

Code

#include <bits/stdc++.h>
#define IOS  std::ios::sync_with_stdio(false);std::cin.tie(0);
#define ll long long
#define db double
#define PII pair<int, int>
#define ALL(x) x.begin(), x.end()
#define debug(x) cerr<<#x<<"->"<<x<<endl
using namespace std;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
const db esp=1e-12;
void solve()
{
    int n,x;
    cin >> n >> x;
    if(n % x)
    {
        puts("-1");
        return ;
    }
    int info = n/x,t = n;
    if(x == n)
    {
        cout << x << " ";
        for(int i = 2;i <= n - 1;i ++) cout << i << " ";
        cout << 1 << endl;
        return ;
    }
    vector<int>p;
    for(int i = 2;i <= info;i ++)
    {
        while(info % i == 0)
        {
            info /= i;
            p.push_back(i);
        }
    }
    if(info) p.push_back(info);
    vector<int>ans(n + 10);
    for(int i = 2;i <= n - 1;i ++) ans[i] = i;
    for(int i = p.size() - 1;i >= 0;i --)
    {
        ans[t / p[i]] = t;
        t /= p[i];
    }
    cout << x << " ";
    for(int i = 2;i <= n - 1;i ++) cout << ans[i] << " ";
    cout << 1 << endl;
}
int main()
{
    int tt;
    cin >> tt;
    while(tt --)
        solve();
    return 0;
}

 D. Range = √Sum

D. Range = √Sum

题意

        构造一个长度为n的数组,数组中数字各不相同,满足这个数组的最大值 - 最小值(极差) = 数组和的平方根。

思路

        快把构造端下去吧,已经品鉴的够多了(大悲

        我们要构造的这个数组的数组和是一个完全平方数,我们还是分奇数偶数考虑

        n为偶数这种情况比较好考率,考虑n * n,实际上就是[n - n/2 , n) ∪ (n , n + n/2]的和

        n为奇数:一开始想构造(n + 1) ^ 2 = n ^ 2 + 2 * n + 1,也就是构造n+1的平方然后在这个序列中剃掉n和n + 1,一想不对,这个序列本来就不含n + 1。。。然后考虑了一下n^2怎么构造,发现直接构造一个序列n - n/2 ,n - n/2 + 1,...,n,...,n + n/2 - 1,n + n/2 + 1,这个序列的和就是n^2,但是此时极差为n - 1,我们考虑把所有数都加上2,此时的和就会变成n ^ 2 + 2 * n,是不是有点像(n + 1)^ 2了,我们把最小值-1,最大值+1,极差变为n + 1,和不变,再把次大值+1,数组和就变成了(n + 1)^ 2,over。

Code

#include <bits/stdc++.h>
#define IOS  std::ios::sync_with_stdio(false);std::cin.tie(0);
#define ll long long
#define db double
#define PII pair<int, int>
#define ALL(x) x.begin(), x.end()
#define debug(x) cerr<<#x<<"->"<<x<<endl
using namespace std;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
const db esp=1e-12;
void solve()
{
    int n;
    cin >> n;
    vector<int>res;
    if(n & 1)
    {
        for(int i = n - n / 2; i <= n + n / 2;i ++)
            res.push_back(i + 2);
        res[0] --;
        res[res.size() - 1] ++;
        res[res.size() - 2] ++;
    }
    else
    {
        for(int i = n - n / 2;i <= n + n / 2;i ++)
        {
            if(i == n) continue;
            res.push_back(i);
        }
    }
    for(auto i : res) cout << i << " ";
    cout << endl;
}
int main()
{
    int tt;
    cin >> tt;
    while(tt --)
        solve();
    system("pause");
    return 0;
}

喜报:e和f不是构造

悲报:2500分以上的题我这个菜狗怎么会啊

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值