首页 > 其他分享 >【ErikTse】2023-Codeforces新手训练营 第六期题解

【ErikTse】2023-Codeforces新手训练营 第六期题解

时间:2023-12-01 18:12:39浏览次数:42  
标签:i64 const int 题解 Codeforces long ErikTse solve using

A. Wrath

题目大意

给你一个\(L\)数组和\(n\)个人,第\(i\)个人可以使用威力为\(L_i\)的闪电旋风劈击杀前面\(L_i\)人,问你最后能存活多少人?

思路

差分。开一个数组来标记当前威力的闪电旋风劈能击杀到的最远的人和使用技能的人,最远击杀的人所在的位置+1,自己的位置-1,这样算前缀和时所在位置被标记为0的人就是存活的人

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    int n;
    cin >> n;
    int ans = 0;
    std::vector<int> v(n + 1), st(n + 1);
    for (int i = 1; i <= n; i++) cin >> v[i];
    for (int i = 2; i <= n; i++) {
        int t = max(1, i - v[i]);
        st[t] += 1;
        st[i] -= 1;
    }

    for (int i = 1; i <= n; i++) {
        st[i] += st[i - 1];
        if (!st[i]) ans ++;
    }

    cout << ans << endl;
    
}

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

    int t = 1;
    //cin >> t;
    while (t --) solve();

    return 0;
}

B. Chtholly's request

题目大意

定义长度为偶数的十进制回文数为\(zcy\)数,让你求前\(n\)个zcy数之和再模上\(p\)的结果

思路

很明显,第\(i\)个\(zcy\)数就是\(i\)后面接上\(i\)的逆序,例如第\(114514\)个\(zcy\)数就是114514415411

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    i64 k, p;
    cin >> k >> p;
    i64 ans = 0;
    for (int i = 1; i <= k; i++) {
        string tmp1 = to_string(i);
        string tmp2 = tmp1;
        reverse(tmp2.begin(), tmp2.end());
        tmp1 = tmp1 + tmp2;
        ans += stoll(tmp1);
        ans %= p;
    }
    cout << ans % p << endl;
}

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

    int t = 1;
    //cin >> t;
    while (t --) solve();

    return 0;
}

C. Powers Of Two

题目大意

给你两个整数\(n\)和\(k\),问你\(n\)是否可以由\(k\)个2的幂组成,例如8可以由4、4或者1、1、1、1、2、2组成

思路

用sum记录\(n\)写成二进制时\(1\)的个数,这里表示\(n\)最少能用sum个2的幂组成。我们能看到,这 sum个 2的幂里 大于\(1\)的数 每除一下2,就能多出来一个 2的幂,我们可以用这种方法可以找出能组成\(n\)的\(k\)个数

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    i64 n, k, sum = 0;
    cin >> n >> k;

    i64 cnt[70] = {0};

    for (i64 i = 0; i < 64; i++) {//记录一下n的二进制里哪些位置有1
        if ((n >> i) & 1) {
            cnt[i] ++;
            sum ++;
        }
    }  

    int idx = 64;
    while (idx && sum < k) {//从后往前枚举
        if (cnt[idx]) {
            while (cnt[idx] && sum < k) {
                if (idx) {
                    sum ++;
                    cnt[idx] --;
                    cnt[idx - 1] += 2;
                }
            }
        }
        idx --;
    }


    if (sum != k) cout << "NO\n";
    else {
        cout << "YES\n";
        for (int i = 0; i < 70; i++) {
            while (cnt[i] --) cout << (1 << i) << ' ';
        }
    }
}

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

    int t = 1;
    //cin >> t;
    while (t --) solve();

    return 0;
}

D. Fadi and LCM

题目大意

给你一个整数\(x\),让你找出两个数\(a\)、\(b\),使得\(LCM(a, b) == x\),且\(max(a, b)\)尽量小

思路

\(x\)的范围有1e12,\(\sqrt{x}\)只有1e6,直接枚举即可。
还有,我们知道\(gcd(a, b) * lcm(a, b) == a * b\)

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    i64 x, a = inf, b = inf;
    cin >> x;
    for (i64 i = 1; i * i <= x; i ++) {
        if (x % i) continue;
        i64 tmpa = i, tmpb = x / i;
        if (tmpa * tmpb /__gcd(tmpa, tmpb) == x)
            if (max(tmpa, tmpb) < max(a, b)) 
                a = tmpa, b = tmpb;
    }

    cout << a << ' ' << b << endl;
}

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

    int t = 1;
    //cin >> t;
    while (t --) solve();

    return 0;
}

E. Line Empire

题目大意

太长了不想打

思路

当换首都的贡献小于不换首都的贡献时就换首都

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    i64 n, a, b, ans = 0;
    cin >> n >> a >> b;
    std::vector<int> v(n + 1), s(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
        s[i] = s[i - 1] + v[i];
    }

    int now_cap = 0;
    for (int i = 1; i <= n; i++) {
        ans += b * (v[i] - now_cap);

        i64 t1 = b * (s[n] - s[i] - (n - i) * now_cap);//不换首都,且用当前首都攻击后面的全部首都
        i64 t2 = a * (v[i] - now_cap) + b * (s[n] - s[i] - (n - i) * v[i]);//换首都,且用更换后的首都攻击后面的全部首都
        if (t2 < t1) {
            ans += a * (v[i] - now_cap);
            now_cap = v[i];
        }
        
    }

    cout << ans << endl;
}

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

    int t = 1;
    cin >> t;
    while (t --) solve();

    return 0;
}

标签:i64,const,int,题解,Codeforces,long,ErikTse,solve,using
From: https://www.cnblogs.com/kichuan/p/17870585.html

相关文章

  • DBeaver连接PostgreSQL后只有默认数据库“postgres”不显示其他数据库的问题解决办法
    我们在使用DBeaver连接PostgreSQL后,发现数据库中只有“postgres”默认数据库,不显示我们自己创建的数据库。1、......
  • CF1896D Ones and Twos 题解
    题意:思路:先考虑不带修:如果长度为$n$的序列$a$中无$1$,当且仅当$2\les\lesum(1,n)$时,一定有解;否则,一定无解。通过$set$维护序列$a$中每个$1$的位置,找到最靠左的$1$的位置$l$以及最靠右的$1$的位置$r$。对于区间$[l,n]$,由......
  • ABC270F 题解
    和博客园一样好的体验思路首先看到花最小代价使得所有点连通,果断转换成最小生成树问题。接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权。因为一个点飞或者划船到另一个点要两重代价,所以若我们想让\(u\)和\(v\)建能飞过去的边,我......
  • P6859 蝴蝶与花 题解
    题意:有一个长度为$n$的序列$a$,其中所有元素都为$1$或$2$,要求进行$q$次操作,每次操作为以下之一:$A$$s$:询问是否存在$a$的连续子序列满足其中元素总和为$s$,若有合法的方案,输出这个方案的左右端点位置(多种方案时输出左端点最小的方案),否则输出$......
  • CF1835D Doctor's Brown Hypothesis 题解
    题目链接点击打开链接题目解法首先只有在一个强联通分量里的点对才可能合法,因此我们这里说的图默认为强联通图但是上面的条件成立只需要满足\(k\gen\),考虑用好\(k\)可以认为是极大的性质所以说我们可以通过图中所有的环\(+\)路径来凑出\(k\)不难发现,所有的环能构成的......
  • CF249题解
    CF249linkCF249ElinkCF249E题意给你一个形如下图的矩阵并有\(T\)组询问每组询问给出\(x_1,y_1,x_2,y_2\)。求\(\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y_2}A[i][j]\)。其中\(A[i][j]\)表示在矩阵中的数。\(T\leq10^5\)\(1\leqx_1\leqx_2\leq10^9\)\(1\leqy_1......
  • P7110 晚秋绝诗 题解
    好有意思的题目啊。出题人太厉害了。思路考虑一个结论:我们将两个没插旗的点与中间的点称为一段,其中中间的点必须全部插旗。那么这一段如果已知两座山的高度,就一定可以得知所有的高度。考虑为什么。加入这一段是\(a\simb\)。\[\begin{cases}h_a+h_{a+2}=2\timesh_{a+1}......
  • Advent of Code 2023题解 [Mathematica/Python]
    Day1Part1(*读取文件*)lines=ReadList["E:\\ExplorerDownload\input.txt",String];(*计算校准值*)calibrationValues=ToExpression[StringJoin[#[[1]],#[[-1]]]]&/@(StringCases[#,DigitCharacter]&/@lines);(*打印总和*)Pri......
  • Codeforces Round 912 (Div. 2)
    CodeforcesRound912(Div.2)基本概述最难受的一集。A题秒了。B题幸苦推了两个小时,最后也通过了pretest了,结果赛后被HACK。C题知道是DP,但觉得不好推状态转移方程,所以全心全意去做B题了。爆掉\(150\)分B.StORageroom我的思路其实就几乎是答案。之前几乎没怎......
  • CF1198题解
    CF1198CodeforcesRound576(Div.1)CF1198AlinkCF1198A题意有一种数字化一段录音的常用方式,是记录每一个时刻的强度值。这些非负的强度值就可以代表一段音频对于一段音频,若有\(K\)个不同的强度值,那么每一位我们都需要\(k=\lceil\log_2K\rceil\)\(\text{bit}\)来存......