首页 > 其他分享 >Codeforces Round 941 (Div. 2)

Codeforces Round 941 (Div. 2)

时间:2024-04-28 21:12:08浏览次数:19  
标签:end int Codeforces long 941 using Div 石堆 define

A. Card Exchange

贪心

如果有某个数出现 \(k\) 次及以上,则通过操作使其数量变为 \(k\),再变为其他出现过的数,则会增加至至少 \(k\) 个,一直进行如上操作,可以发现数组最终只剩 \(k - 1\) 个数;否则为 \(n\)。

#include <bits/stdc++.h>

using namespace std;

#define cctie ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define all(x) x.begin(), x.end()
#define ALL(x) x.begin() + 1, x.end()

using i64 = long long;
using i128 = __int128;

const int INF = 0x3f3f3f3f;

void solve() {
    int n, k;
    cin >> n >> k;

    vector<int> c(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> c[i];
    }

    vector<int> cnt(101);
    for (int i = 1; i <= n; i++) {
        cnt[c[i]]++;
    }

    bool f = false;
    for (int i = 1; i <= 100; i++) {
        if (cnt[i] >= k) {
            f = true;
        }
    }

    if (f) {
        cout << k - 1 << '\n';
    } else {
        cout << n << '\n';
    }
}

void prework() {

}

int main() {
    cctie;

    prework();

    int T;
    cin >> T;

    while (T--) {
        solve();
    }

    return 0;
}

B. Rectangle Filling

思维

对于网格左上角的方格而言,当且仅当网格最右侧和最下侧都出现了与左上角相同的颜色时可以实现全网格同色,右下角同理,左下和右上已经包括在前两种情况中了,不用重复判断。

时间复杂度: \(O(nm)\)。

#include <bits/stdc++.h>

using namespace std;

#define cctie ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define all(x) x.begin(), x.end()
#define ALL(x) x.begin() + 1, x.end()

using i64 = long long;
using i128 = __int128;

const int INF = 0x3f3f3f3f;

void solve() {
    int n, m;
    cin >> n >> m;

    vector<vector<char>> a(n + 1, vector<char>(m + 1));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }

    bool col = false, row = false;
    for (int i = 1; i <= n; i++) {
        if (a[i][m] == a[1][1]) {
            col = true;
        }
    }
    for (int i = 1; i <= m; i++) {
        if (a[n][i] == a[1][1]) {
            row = true;
        }
    }

    if (col && row) {
        cout << "YES\n";
    } else {
        col = false, row = false;
        for (int i = 1; i <= n; i++) {
            if (a[i][1] == a[n][m]) {
                col = true;
            }
        }
        for (int i = 1; i <= m; i++) {
            if (a[1][i] == a[n][m]) {
                row = true;
            }
        }
        if (col && row) {
            cout << "YES\n";
        } else {
            cout << "NO\n";
        }
    }
}

void prework() {

}

int main() {
    cctie;

    prework();

    int T;
    cin >> T;

    while (T--) {
        solve();
    }

    return 0;
}

C. Everything Nim

博弈论

考虑对原数组排序去重后考虑,若最小石堆石头数大于 \(1\),则先手必胜,考虑几个石堆中的石头数连续时,先手可以决定拿 \(1\) 或 \(n - 1\) 来让任意一方最后拿完这些石堆,因此爱丽丝只要一直最优选择,一定获胜;若最小石堆石头数为 \(1\),则与该石堆连续的所有石堆的操作都是固定的,即双方轮流取 \(1\),当这些石堆取完之后,可以发现回到了最小石堆石头数大于 \(1\) 的情况,于是只要判断此时谁是先后手即可,注意特判已经无非空石堆的情况。

时间复杂度:\(O(nlogn)\) 。

#include <bits/stdc++.h>

using namespace std;

#define cctie ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define all(x) x.begin(), x.end()
#define ALL(x) x.begin() + 1, x.end()

using i64 = long long;
using i128 = __int128;

const int INF = 0x3f3f3f3f;

void solve() {
    int n;
    cin >> n;

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

    sort(ALL(a));
    a.erase(unique(ALL(a)), a.end());
    n = a.size() - 1;

    int t = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] - a[i - 1] != 1) {
            t = i;
            break;
        }
    }
    if ((t & 1) || (t == 0 && (n & 1))) {
        cout << "Alice\n";
    } else {
        cout << "Bob\n";
    }
}

void prework() {

}

int main() {
    cctie;

    prework();

    int T;
    cin >> T;

    while (T--) {
        solve();
    }

    return 0;
}

D. Missing Subsequence Sum

构造、位运算

​ 先考虑如何构造子序列和包含 \([1,n]\) 的数组,显然数组 \(2^0,2^1,2^2,...,2^{19}\) 满足条件,然后考虑如何仅仅把 \(k\) 去除,记 \(k\) 的最高位为 \(h\),则将 \(2^h\) 替换为 \(k-1-\sum_{i=0}^{h-1}2^i\),则前 \(h+1\) 项显然满足子序列和包含 \([1,k-1]\),此时问题转变为考虑如何更改第 \(h+2\) 项及往后的数或添数来使子序列和包含 \([k+1,n]\),这里考虑通过添数来实现。

​ 可以发现现在无法构造出来的区间为 \([k, 2^{h+1}-1]\) 以及在两端点加上若干不重复的高位一(\(2^t(t>h)\))的所有区间并,于是添 \(k+1\) 至数组,这时包含了区间 \([k+1,2k]\) (由 \([1,k-1]\) 和数 \(k+1\) 得到),由前面的定义可知 \(2k>2^{h+1}-1\),则此时无法构造出来的区间转变为 \([k, k]\) 以及在两端点加上若干不重复的高位一(\(2^t(t>h)\))的所有区间并,而 \(k\) 本身无需构造,所以只需考虑由 \(+k\) 延申出来的数即可。

​ 此处考虑添 \(\sum_{i=0}^{h}2^i\) 即 \(2^{h+1}-1\) 至数组,而该数与已添加的数 \(k + 1\) 恰能凑出 \(k + 2^{h+1}\),而这最小项凑出后,通过进位,之后的每一个类似形式的值也都能构造出来。

最后注意特判一下 \(k=1\) 的情况,该方法所构造的数组的有效数的个数最多为 \(23\) 个。

#include <bits/stdc++.h>

using namespace std;

#define cctie ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define all(x) x.begin(), x.end()
#define ALL(x) x.begin() + 1, x.end()

using i64 = long long;
using i128 = __int128;

const int INF = 0x3f3f3f3f;

void solve() {
    int n, k;
    cin >> n >> k;

    int x = 1, s = 0;
    vector<int> a(26);
    int i;
    for (i = 1; i <= 25; i++) {
        if (s + x < k) {
            a[i] = x;
            s += x;
            x <<= 1;
        } else {
            a[i] = k - 1 - s;
            break;
        }
    }
    a[++i] = k + 1;
    if ((s + (x << 1)) != k) {
        a[++i] = (s + (x << 1));
    }
    if (k == 1) {
        a[++i] = 3;
    }
    while (i < 25) {
        x <<= 1;
        a[++i] = x;
    }

    cout << 25 << '\n';
    for (int i = 1; i <= 25; i++) {
        cout << a[i] << " \n"[i == 25];
    }
}

void prework() {

}

int main() {
    cctie;

    prework();

    int T;
    cin >> T;

    while (T--) {
        solve();
    }

    return 0;
}

标签:end,int,Codeforces,long,941,using,Div,石堆,define
From: https://www.cnblogs.com/xiojoy/p/18164489

相关文章

  • Codeforces Round 941 (Div. 2) D
    好坐牢的一次div2ABC是速通的,结果cf的pretest太弱了。。然后我这次因为想快点,没有再去好好顺一遍思路,状态又不太好,写了一个好简单的错,结果过了。导致我被hack了,爆掉100分。好烦。主要说说这个D。现在能够从算式的层面上理解了这个做法的正确性,就是把二进制位的数字放进去,然后......
  • Solution of Codeforces 1957B
    DescriptionGivenintegers\(n\)and\(k\),findanon-negativesequence\(\{a_n\}\)satisfyingthefollowingconditions:1.\[\sum_{i=1}^na_i=k\]Thebinaryrepresentationof\(a_1\mida_2\mid\dots\mida_n\)hasthemaximumnumbero......
  • js调整div顺序
    js调整div顺序并保留div原有事件等<divclass="my_tabs"><divclass="el-tabs__nav-scroll"><divclass="el-tabs__nav"><divclass="el-tabs__itemis-active">AAAA</div><d......
  • Codeforces Round 936 (Div. 2)
    A考虑有\(x\)个数与中位数相同,且在中位数之后,则答案为\(x+1\)(+1是因为中位数本身)。B明显的,每次操作序列的最大子段和。那么操作完以后,继续操作这个区间即可,相当于每次翻倍。假设原序列最大子段和为区间\([l,r]\),则答案为:\[sum(1,n)-sum(l,r)+sum(l,r)\times2^k\]记......
  • Codeforces Round 931 (Div. 2) D2
    挺简单的题目,就是一个普通博弈论套了一个交互的皮。。。但是恶心的就是,交互的皮是真难顶啊,什么sb玩意,我因为爆了int一直给我现实TLEontest1,这我怎么调?不得不说,交互题和普通的题目真是差别太大了,就评测这一块,返回的消息完全无法给我有效的指导。。然后我就直接坐大牢。要是这......
  • Codeforces Round 939 (Div. 2) E1-E2
    CodeforcesRound939(Div.2)E1.Nenevs.Monsters(EasyVersion)题意:有n个怪物,能量等级为\(a_i\),现在可以使用一种法术,使第1个怪物攻击第2个怪物,第2个怪物攻击第3个怪物……第n个怪物攻击第1个怪物,当能量等级为x的怪物攻击能量等级为y的怪物时,怪物y->max(y-x,0),在经过\(1......
  • Codeforces Round 892 (Div. 2) E
    E的话一眼dp,然后观察一下方程,\(f[i][j]表示前i个位置已经选了长度为j的区间,且第i个位置已经被选上时,能够获得的最大值\)\[f[i][j]=\displaystyle\max_{1\leqk\leqmin(i,j)}(f[i-k][j-k]+calc(i-k+1,j))\\calc(l,r)=|b_l-a_r|+|b_r-a_l|\]这样的dp是\(O(n^2k)\)的,而\(1\leqk......
  • cf 1601B Frog Traveler Codeforces Round 751 (Div. 1)
     Problem-1601B-Codeforces BFS然后每次上升可以的范围是一个区间,然后每次都遍历这个区间的所有点,那么超时。用set等方式,合并这些区间,之前没遍历过的范围才更新(加入BFS需要遍历的队列里)。但是区间的更新特别容易写错…… 我的代码和造数据1/**2记录两个vi......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
    CodeforcesRound940(Div.2)andCodeCraft-23题解题目链接A.Stickogon贪心#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebu......
  • Educational Codeforces Round 164 (Rated for Div. 2)
    A.PaintingtheRibbon题意:n个物体,m个颜色,alice要给每个物体任意涂一个颜色。bob可以给k个物体涂色,问alice能否阻止bob让所有的物体颜色都相同。思路:思维题。如果m=1,那么无解。如果m>1,那么bob如果想要染成同一个颜色,alice可以让bob需要染色的数量最多。如果染色的数量最多,那......