Martian148's blog Martian148's blog
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档

Martian148

一只热爱文科的理科生
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档
  • codeforses 题解

    • Codeforces Round 933 (Div. 3) A-G 题解
    • Educational Codeforces Round 168 (Rated for Div. 2) A-E 题解
    • Codeforces Round 969 (Div. 2) A-D 题解
    • Codeforces Round 1011 (Div. 2) A-E 题解
    • Educational Codeforces Round 177 (Rated for Div. 2) A-D 题解
    • Codeforces Round 1015 (Div. 1 + Div. 2) A-E 题解
      • A - Max and Mod
        • Question
        • Solution
        • Code
      • B - MIN = GCD
        • Question
        • Solution
        • Code
      • C - You Soared Afar With Grace
        • Question
        • Solution
        • Code
      • D - Arcology On Permafrost
        • Question
        • Solution
        • Code
      • E - Blossom
        • Question
        • Solution
    • Codeforces Round 1016 (Div. 3) A-G 题解
  • atcoder 题解

  • XCPC 题解

  • 校训练赛题解

  • 牛客题解

  • 蓝桥杯题解

  • 典题选讲

  • 杂题

  • 算法题解
  • codeforses 题解
martian148
2025-04-08
目录

Codeforces Round 1015 (Div. 1 + Div. 2) A-E 题解

Codeforces Round 1015 (Div. 1 + Div. 2) (opens new window)

# A - Max and Mod

# Question

给定一个整数 nnn,你需要构造一个长度为 nnn 的排列,满足

  • 对于 ∀i,2≤i≤n\forall i,2\le i\le n∀i,2≤i≤n,max⁡(pi,pi−1)≡i−1(modi)\max(p_i,p_{i-1})\equiv i-1\pmod{i}max(pi​,pi−1​)≡i−1 (modi)

如果无解则输出 −1-1−1

# Solution

当nnn是奇数时,我们可以构造 p=[n,1,2,…,n−1]p = [n, 1, 2, \ldots, n - 1]p=[n,1,2,…,n−1]

  • 对于i=2i = 2i=2,max⁡(p1,p2)=n\max(p_1, p_2) = nmax(p1​,p2​)=n并且nmod2=1n \bmod 2 = 1nmod2=1
  • 对于i≥3i \geq 3i≥3,max⁡(pi−1,pi)=i−1\max(p_{i - 1}, p_i) = i - 1max(pi−1​,pi​)=i−1并且(i−1)modi=i−1(i - 1) \bmod i = i - 1(i−1)modi=i−1

试证明当 nnn 是偶数时没有解决方案。显然, nnn 不能放置在 p1,p2p_1, p_2p1​,p2​ 或 pnp_npn​

如果 nnn 放置在位置 3∼n−13 \sim n - 13∼n−1,让 xxx 为 nnn 的位置,则我们有max⁡(px−1,px)=max⁡(px,px+1)=n\max(p_{x - 1}, p_x) = \max(p_x, p_{x + 1}) = nmax(px−1​,px​)=max(px​,px+1​)=n

因此,必须存在一个偶数 2≤i≤n2 \leq i \leq n2≤i≤n,使得 max⁡(pi−1,pi)=n\max(p_{i - 1}, p_i) = nmax(pi−1​,pi​)=n 并且它必须满足 max⁡(pi−1,pi)modi=i−1\max(p_{i - 1}, p_i) \bmod i = i - 1max(pi−1​,pi​)modi=i−1 。然而,一个偶数对另一个偶数取模永远不能产生奇数结果,导致矛盾。

# Code

点击查看
#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n; cin >> n;
    if (n % 2 == 0) {
        cout << -1 << '\n';
    }
    else {
        cout << n << ' ';
        for (int i = 1; i < n; i++) {
            cout << i << ' ';
        }
        cout << '\n';
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int T; 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

# B - MIN = GCD

# Question

给定一个长度为 nnn 的数组 aaa,现在你可以重拍 aaa,使得存在一个 i,(1≤i<n)i,\ (1\le i< n)i, (1≤i<n),满足: $$ \min(a[1],a[2],\cdots,a[i])=\gcd(a[i+1],a[i+2],\cdots,a[n]) $$ 输出 Yes 或 No

  • n≤105n\le 10^5n≤105

# Solution

我们设 x=min⁡(ai)x=\min(a_i)x=min(ai​),想要让这个式子成立,肯定需要把 xxx 放在最小值的那一边,然后需要在 aaa 中挑出一些数使得这些数的 gcd⁡=x\gcd=xgcd=x

我们把 xxx 的倍数挑出来组成这些数,如果 xxx 的倍数的 gcd⁡=x\gcd=xgcd=x,就是 Yes,如果 aaa 中出现了多个 xxx,显然也是 Yes

# Code

点击查看
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}

void solve() {
    int n; cin >> n;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int min_i = min_element(a.begin() + 1, a.end()) - a.begin();
    ll g = 0;
    for (int i = 1; i <= n; i++) {
        if (i == min_i) continue;
        if (a[i] % a[min_i] == 0) {
            g = gcd(g, a[i]);
        }
    }
    cout << (g == a[min_i] ? "Yes" : "No") << '\n';
}

int main() {
    freopen ("B.in", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int T; 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

# C - You Soared Afar With Grace

# Question

给定两个长度为 nnn 的数组 a,ba,ba,b,你最多操作 nnn 次,每次操作如下:

  • 选择一对 i,ji,ji,j 交换 ai,aja_i,a_jai​,aj​,同时交换 bi,bjb_i,b_jbi​,bj​

输出方案

# Solution

暴力模拟就好了

枚举每一个 aia_iai​,去 bbb 中找 aia_iai​ 这个数的位置,假设这个位置为 yyy,执行 (y,n+1−i)(y,n+1-i)(y,n+1−i) 的交换操作就好了

最后操作完之后查看是否满足要求,若不满足则输出 -1

# Code

点击查看
#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n; cin >> n;
    vector<int> a(n + 1);
    vector<int> b(n + 1);

    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];

    vector<int> b_id(n + 1);
    for (int i = 1; i <= n; i++)
        b_id[b[i]] = i;

    vector<pair<int, int>> ans; 

    auto swap = [&] (int x, int y) {
        if (x == y) return ;
        ans.push_back({x, y});
        int tmp = a[x];
        a[x] = a[y]; a[y] = tmp;

        tmp = b[x];
        b[x] = b[y]; b[y] = tmp;

        b_id[b[x]] = x; b_id[b[y]] = y;
    };

    int same = 0, same_i = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] == b[i]) {
            same += 1;
            same_i = i;
        }
    }
    if (same > 1 || (same == 1 && n % 2 == 0)) {
        cout << -1 << '\n';
        return ;
    }
    if (same == 1) {
        swap(same_i, (n + 1) / 2);   
    }
    for (int i = 1; i <= n; i++) {
        if (a[i] == b[n + 1 - i]) continue;
        swap(b_id[a[i]], n + 1 - i);
    }

    int flg = 1;
    for (int i = 1; i <= n; i++) 
        if (a[i] != b[n + 1 - i]) flg = 0;
    
    if (flg == 0) {
        cout << -1 << '\n';
        return ;
    }

    cout << ans.size() << '\n';
    for (auto [x, y] : ans) {
        cout << x << ' ' << y << '\n';
    }

    return ;
} 

int main() {
    freopen ("C.in", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int T; 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

# D - Arcology On Permafrost

# Question

给定三个整数 n,m,kn,m,kn,m,k

现在需要你构造一个长度为 nnn 的数组 aaa,需要满足操作后的 mexmexmex 最大,操作如下:

你可以从 aaa 中依次删除长度为 kkk 的字段至多 mmm 次,让删除后 aaa 的 mex 最小

  • n≤105,m⋅k<nn\le 10^5,m\cdot k<nn≤105,m⋅k<n

# Solution

先思考给定一个数组 aaa,怎样取才能使得 mex 最小

思路肯定是先把 000 取完,如果发现 000 取不完,考虑取 111,如果发现 111 取不完,就考虑取 222,以此类推

假设最后的 mex 是 xxx,那么小于 xxx 的书需要至少出现 m+1m+1m+1 次,所以 xxx ,是满足 x⋅(m+1)≤nx\cdot (m+1)\le nx⋅(m+1)≤n 最大的 xxx

但是也要考虑到 kkk 的大小,如果 kkk 太大,一次能同时删除两个 000,显然这种构造不太好,所以说 000 之间的跨度必须要大于 kkk

所以贪心地放,肯定是 0,1,2,3⋯x−1,0,1,⋯0,1,2,3\cdots x-1,0,1,\cdots0,1,2,3⋯x−1,0,1,⋯,这样循环放比较好,所以得到不等式 x≥kx\ge kx≥k

于是得到 x=max⁡(⌊nm+1⌋,k)x=\max(\lfloor\frac{n}{m+1}\rfloor,k)x=max(⌊m+1n​⌋,k)

# Code

点击查看
#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n, m, k; cin >> n >> m >> k;
    int p = max(n / (m + 1), k);
    for (int i = 0; i < n; i++)
        cout << i % p << ' ';
    cout << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int T; 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

# E - Blossom

# Question

给定一个长度为 nnn 的排列 aaa,其中有一些缺失值用 −1-1−1 表示

将排列的值定义为所有非空子段的 mex 的总和

找到填充 aaa 中缺失元素可以形成的所有可能有效排列的值之和,对 109+710^9+7109+7 取模。

# Solution

Educational Codeforces Round 177 (Rated for Div. 2) A-D 题解
Codeforces Round 1016 (Div. 3) A-G 题解

← Educational Codeforces Round 177 (Rated for Div. 2) A-D 题解 Codeforces Round 1016 (Div. 3) A-G 题解→

最近更新
01
Java基础语法
05-26
02
开发环境配置
05-26
03
pink 老师 JavaScript 学习笔记
05-26
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Martian148 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式