首页 > 其他分享 >Codeforces Round #836 (Div. 2) A-D

Codeforces Round #836 (Div. 2) A-D

时间:2022-11-26 21:00:39浏览次数:63  
标签:836 cout int 复杂度 Codeforces long cdots solve Div

比赛链接

A

题意

给一个字符串 \(s\) ,对其加倍,即每个字符后面追加一个相同字符。

加倍后可以重排列,要求构造一个回文串。

题解

知识点:构造。

既然可以重排列了,那顺序是随意的了,直接翻转加在原来的后面。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    string s;
    cin >> s;
    cout << s;
    reverse(s.begin(), s.end());
    cout << s << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

B

题意

构造有 \(n\) 个数的序列 \(a(1\leq a_i \leq 10^9)\) ,满足:

\[a_1 \oplus a_2 \oplus \cdots \oplus a_n = \frac{1}{n} \sum_{i=1}^{n} a_i \]

题解

知识点:构造。

方法一

  1. \(n\) 为奇数,显然构造一样的 \(n\) 个数就行。

  2. \(n\) 为偶数,仿造奇数情况,尝试在 \(n-1\) 个数 \(a\) 后加一个数 \(b\) ,于是我们只要找到满足 \(n(a \oplus b) = (n-1)a + b\) 的 \(a\) 和 \(b\) 即可。

假设 \(a>b\) ,根据需要满足的条件可以得到 \(a \oplus b < a\) ,因此我们需要用 \(b\) 通过异或缩小 \(a\) 。

我们假设 \(b\) 只会消去一些 \(a\) 的二进制位,而不会增加,那么 \(a \oplus b = a-b\) ,从而原方程变为 \(n(a-b) = (n-1)a + b\) ,解得 \(a = (n+1)b\) 。

我们取 \(b = 1\) ,那么 \(a = n+1\) ,刚好满足两条假设 \(a>b\) 和 \(a \oplus b = a-b\) ,因此是合法的。

方法二

  1. \(n\) 为奇数,构造 \(n\) 个 \(2\) 。
  2. \(n\) 为偶数,构造 \(n-2\) 个 \(2\) ,随后 \(1\) 和 \(3\) 。

时间复杂度 \(O(n)\)

空间复杂度 \(O(1)\)

代码

方法一

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n;
    cin >> n;
    for (int i = 1;i <= n - 1;i++)  cout << n + 1 << ' ';
    if (n & 1) cout << n + 1 << '\n';
    else cout << 1 << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

方法二

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n;
    cin >> n;
    if (n == 1) {
        cout << 2 << '\n';
        return true;
    }
    for (int i = 1;i <= n - 2;i++)  cout << 2 << ' ';
    if (n & 1) cout << 2 << ' ' << 2 << '\n';
    else cout << 1 << ' ' << 3 << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

C

题意

给出 \(n,x\) ,构造一个长为 \(n\) 的排列 \(p\) ,满足 \(p_1 = x,p_n = 1\) ,且 \(p_i\) 是 \(i\) 的倍数,其中 \(2\leq i \leq n-1\) ,多个答案输出字典序最小的。

题解

方法一

知识点:构造,数论,质因子分解。

注意到 \(n \mod x \neq 0\) 时,一定不存在方案。因为 \(x\) 不是合法的位置,那么假设 \(n\) 放在任意合法的位置,那个位置的数一定会替换在他前面合法位置的数。但这些数一定是 \(n\) 的因子,那么一定不是 \(x\) 的倍数,替换到最后一定会有一个素数没地方放,因此无解。

如果有解,我们要让字典序最小。因为 \(x\) 空出来了,我们可以每次往前提最小的合法的数字,这样字典序最小。

我们可以分解 \(d = \frac {n}{x}\) 的质因子,得到 \(d = a_1^{k_1}a_2^{k_2}\cdots a_n^{k_n}\) ,每次让当前位置下标乘上目前最小质因子的数填到当前位置,即

\[\begin{aligned} & p_x = a_1x\\ & p_{a_1x} = a_1^2x \\ & \cdots\\ & p_{a_1^{k_1-1}} = a_1^{k_1}x\\ & p_{a_1^{k_1}} = a_1^{k_1}a_2x\\ & \cdots\\ & p_{a_1^{k_1}a_2^{k_2} \cdots a_n^{k_n-1}} = dx = n \end{aligned} \]

时间复杂度 \(O(n)\)

空间复杂度 \(O(\sqrt n)\)

方法二

知识点:构造,数论。

\(n \mod x \neq 0\) 无解。

如果有解,我们先令排列 \(x,2,\cdots,x-1,n,x+1,\cdots,n-1,1\) ,然后把 \(n\) 往后移。设当前 \(p_{cur} = n\) ,如果一个位置 \(i\) 满足 $n \mod i = i \mod cur = 0 $ 那么可以把 \(p_i\) 和 \(p_{cur}\) 交换,这样就将小的数字往前提了。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

方法一

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n, x;
    cin >> n >> x;
    if (n % x) return false;
    int d = n / x;
    vector<int> ft;
    for (int i = 2;i <= d / i;i++) {
        while (d % i == 0) ft.push_back(i), d /= i;
    }
    if (d > 1) ft.push_back(d);
    reverse(ft.begin(), ft.end());
    cout << x << ' ';
    int mul = 1;
    for (int i = 2;i <= n - 1;i++) {
        if (i == mul * x) cout << ((mul *= ft.back()) * x) << ' ', ft.pop_back();
        else cout << i << ' ';
    }
    cout << 1 << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

方法二

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n, x;
    cin >> n >> x;
    if (n % x) return false;
    vector<int> v(n + 1);
    for (int i = 2;i <= n - 1;i++) v[i] = i;
    v[1] = x;
    v[x] = n;
    v[n] = 1;
    int cur = x;
    for (int i = x + 1;i <= n - 1;i++) {
        if (i % cur == 0 && n % i == 0) swap(v[cur], v[i]), cur = i;
    }
    for (int i = 1;i <= n;i++) cout << v[i] << ' ';
    cout << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

D

题意

构造含有 \(n\) 个数的序列 \(a(1\leq a_i\leq 10^9)\) ,满足:

\[\max(a_1,a_2,\cdots,a_n) - \min(a_1,a_2,\cdots,a_n) = \sqrt{\sum_{i=1}^n a_i} \]

题解

知识点:构造。

  1. \(n\) 为偶数时,容易构造等式结果为 \(n\) 的序列 \(n - \frac{n}{2},\cdots ,n-1,n+1,\cdots ,n - \frac{n}{2}\) 。

  2. \(n\) 为奇数时,可以仿造 \(n\) 为偶数的操作,但发现构造等式结果为 \(n\) 的序列是不可能的,原因是数字之间的间隔太小,数字大小上没有操作空间,因此尝试构造等式结果为 \(2n\) 的序列。

同样对称操作,\(3n,3n+\lfloor \frac{2n}{n-1} \rfloor,\cdots ,3n+(\lfloor \frac{n}{2} \rfloor-1) \lfloor \frac{2n}{n-1} \rfloor, 4n,5n-(\lfloor \frac{n}{2} \rfloor-1) \lfloor \frac{2n}{n-1} \rfloor,\cdots ,5n-\lfloor \frac{2n}{n-1} \rfloor,5n\) 即可。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n;
    cin >> n;
    if (n & 1) {
        int d = 2 * n / (n - 1);
        for (int i = 1;i <= n / 2;i++) cout << 3 * n + (i - 1) * d << ' ';
        cout << 4 * n << ' ';
        for (int i = n / 2;i >= 1;i--) cout << 5 * n - (i - 1) * d << ' ';
    }
    else {
        for (int i = n - n / 2;i <= n + n / 2;i++) if (i != n) cout << i << ' ';
    }
    cout << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

标签:836,cout,int,复杂度,Codeforces,long,cdots,solve,Div
From: https://www.cnblogs.com/BlankYang/p/16928287.html

相关文章

  • Codeforces Round #825 (Div. 2)
    A核心思路:这题的第一反应是直接统计a所有的0的数目和b所有的0的数目,然后两式相减。但是我们会发现一个问题,因为有些是可能不需要排序的,所有还有记录下a和b所有不同的个数......
  • NPC:费解的开关、sumdiv
    1、费解的开关​​https://ac.nowcoder.com/acm/contest/998/D​​题目大意:如图。分析:简单分析可知,每个开关至多点击1次,因为你同一个开关点2次又反转回来了相当于没点,而且题......
  • 【解题报告】CF DIV2 #ROUND 717 A~C D(只有思路)
    【解题报告】CFDIV2#ROUND717A~D​​比赛链接​​排名3694,终于上分了,回归pupil好耶A.TitforTat思路简单的贪心,字典序最小那就让前面的-1,然后+1全部加到最后一个数......
  • 【解题报告】CF DIV2 #ROUND 715 A~D
    【解题报告】CFDIV2#ROUND715A~D​​比赛链接​​​rating,已经无所谓了hhB想了个假算法,卡了半天,C也没时间看,我蠢爆了。A.AverageHeight思路速A了,先把奇数全部输出,然......
  • 【解题报告】CF DIV2 #ROUND 716 A~C
    【解题报告】CFDIV2#ROUND716A~C​​比赛链接​​​数学场/规律场A题5分钟速切,B题开始没看懂先看了C,发现C整不来,B整了半天打表找规律一发AC。D貌似要分块莫队之类的还......
  • 【解题报告】CF DIV3 #ROUND 734 A~D1
    【解题报告】CFDIV2#ROUND707A~D​​比赛链接​​比赛评价:一般性,有段时间没打了,甚至忘记多组输入hh。顺便吐槽一下翻译软件确实不行,以后还是直接看英文好了A.Polycarp......
  • CF1141 Div3 欢乐信心赛
    非常轻松的比赛,连我这样的菜鸡也感到充满力量。A用类似于质因数分解的操作搞一搞即可。B将环复制一遍。C可以发现\(q\)就是差分数组。那么差分数组之和最大的地方......
  • Codeforcess834
    Codeforcess目录CodeforcessAcode:Bcode:Ccode:Ccode:Ecode:Fcode:Fcode:A暴力枚单个循环节code:#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#def......
  • Codeforces Round #615 (Div. 3) E
    E.ObtainaPermutation我们显然可以按列来看对于每一列我们发现我们求的就是一个模式串与模板串的最大匹配+位移贡献因为模板串肯定是不同元素我们直接对于模式串......
  • Public NOIP Round #4(Div. 1) 题解
    T1:容易发现每种药品之间互不影响,对每种药品分别计算,对于它所涉及到的区间开个vector存下来,离散化之后差分,然后前缀和,数出只有它一个线段覆盖的段即可。时间复杂度\(\m......