首页 > 其他分享 >Educational Codeforces Round 170 (Rated for Div. 2) ABCD

Educational Codeforces Round 170 (Rated for Div. 2) ABCD

时间:2024-10-16 11:48:49浏览次数:1  
标签:ABCD Educational Rated int cin long ++ cnt dp

来源:Educational Codeforces Round 170 (Rated for Div. 2)

A. Two Screens

题意

给两个屏幕,两种操作,每种操作一秒,求让两个屏幕显示两个指定字符串的最短时间

操作:

  1. 在一个屏幕的字符串后加任意一个字符
  2. 把一个屏幕的内容复制粘贴到另一个屏幕

思路

先弄出相同前缀,复制一下,然后不相同的只能用操作1来一个一个加

代码

string s1, s2;
int main() {
    IOS;
    int t;
    cin >> t;
    while (t--) {
        cin >> s1 >> s2;
        int same = 0;
        for (int i = 0; i < min(s1.length(), s2.length()); i++) {
            if (s1[i] == s2[i]) same++;
            else break;
        }
        cout << s1.length() + s2.length() - same + (same == 0 ? 0 : 1) << endl;
    }
    return 0;
}

B. Binomial Coefficients, Kind Of

思路

这边建议,复制粘贴给的代码,然后打印一下

代码

const int MOD = 1e9 + 7;
long long ksm(long long a, long long b, long long MOD) {
    long long res = 1;
    while (b) {
        if (b & 1) res = (res * a) % MOD;
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}
int main() {
    IOS;
    // int C[20][20];
    // for (int n = 0; n < 20; n++) { // loop over n from 0 to N-1 (inclusive)
    //     C[n][0] = 1;
    //     C[n][n] = 1;
    //     for (int k = 1; k < n; k++) // loop over k from 1 to n-1 (inclusive)
    //         C[n][k] = C[n][k - 1] + C[n - 1][k - 1];
    // }
    // for (int n = 0; n < 20; n++) { // loop over n from 0 to N-1 (inclusive)
    //     for (int k = 1; k < n; k++) { cout << C[n][k] << " "; }
    //     cout << endl;
    // }
    int t;
    cin >> t;
    vector<int> n(t), k(t);
    for (int &i : n) cin >> i;
    for (int &i : k) cin >> i;
    for (int i = 0; i < t; i++) {
        cout << ksm(2, k[i], MOD) << endl;
    }
    return 0;
}

C. New Game

题意

一堆数字,第一次选 \(x\),以后只能选 \(x\) 或 \(x+1\)

所选牌中不同的牌不超过 \(k\) 张

思路

首先想用个 \(cnt\) 数组存每张牌的数量,用双指针维护一个窗口,窗口内的都是连续的数字

由于每次扩充窗口的时候要判断下一个位置和当前位置差值是不是1,我选择把中间连接的 \(cnt\) 搞成一个负数

遇到负数就重新搞窗口

代码

const int N = 4e5 + 10;
int cnt[N];
map<int, int> mp;
void solve() {
    mp.clear();
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        mp[tmp]++;
    }
    int turn = 0; // 有多少数和间隔
    int pre = 0;
    for (auto [num, c] : mp) {
        if (num != pre && num != pre + 1) {
            cnt[++turn] = -1;
        }
        pre = num;
        cnt[++turn] = c;
    }

    int l = 1, r = 0;
    int now = 0;
    int ans = 0;

    while (r <= turn && l <= turn) {
        while (r - l + 1 < k && now + cnt[r + 1] >= now && r + 1 <= turn) now += cnt[++r];
        ans = max(ans, now);
        if (now + cnt[r + 1] < now || r + 1 > turn) { // 如果是遇到负数
            now = 0;
            l = r + 2;
            r++;
        } else {
            now -= cnt[l++];
        }
    }
    cout << ans << endl;
}

D. Attribute Checks

题意

升级打怪,给一个序列,按顺序,遇到0就是升级,但是有两个属性

遇到正数和负数分别代表遇到针对两个属性的怪了

只有自身的对应属性大于等于怪才能打败

问最多打得过多少怪(检查点)

思路

一眼dp,但是n范围有点不对劲,先不管

  1. 思路

\(dp[i][j]\) 表示 到目前为止有 \(i\) 分,这 \(i\) 分有 \(j\) 分分配给智力,也就是 \(k=i-j\) 分给体力那么到第 \(i+1\) 个 \(0\) 之前,最多能过多少检查点

第 \(i\) 分加在智力上

\(dp[i][j]=dp[i-1][j-1] + ([i-1,i]区间内小于j的正数数量) + (区间内小于k的|负数|数量)\)

第 \(i\) 分加在体力上

\(dp[i][j]=dp[i-1][j] + (区间内小于j的正数数量) + (区间内小于k的|负数|数量)\)

比如按如下顺序 \(0(i-1),2, -2, -3, 0(i)\)

当碰到2时,需要对 \(dp[i-1][2\dots(i-1)]\)

每次遇到0的时候都要来一遍状态转移,这是不会t的,但是每次碰到检查点要来一次+1这就是 \(O(mn)\)

就硬交,不死心

  1. 优化

由于有m分,可以先把两分之间的那些用一个差分数组存起来,每次遇到0的时候再操作一下,t不了一点

代码

空间也可以优化,不过这题都可

在原本的数组后面补一个0,好处理点

const int N = 2e6 + 10;
const int M = 5005;
int a[N];
int dp[M][M];
signed main() {
    // IOS;
    int n, m;
    cin >> n >> m;
    rep(i, 0, M) fill_n(dp[i], M, 0);
    for (int i = 0; i < n; i++) cin >> a[i];
    a[n] = 0;
    m++;
    n++;
    
    int zero = 0;
    vector<int> dif(m + 5, 0);
    for (int i = 0; i < n; i++) {
        if (a[i] == 0) {
            zero++;
            for (int j = 1; j <= m + 1; j++) dif[j] += dif[j - 1];

            dp[zero][0] = dp[zero - 1][0] + dif[0];
            for (int j = 1; j <= zero; j++) {
                dp[zero][j] = max(dp[zero - 1][j - 1] + dif[j - 1], dp[zero - 1][j] + dif[j]);
            }
            for (int j = 0; j <= m; j++) dif[j] = 0;

        } else if (a[i] > 0) {
            if (a[i] <= zero) {
                dif[a[i]]++;
                dif[zero + 1]--;
            }
        } else if (a[i] < 0) {
            if (-a[i] <= zero) {
                dif[0]++;
                dif[zero + a[i] + 1]--;
            }
        }
    }

    int ans = 0;
    for (int i = 0; i <= zero; i++) {
        ans = max(ans, dp[zero][i]);
    }
    cout << ans;

    return 0;
}

标签:ABCD,Educational,Rated,int,cin,long,++,cnt,dp
From: https://www.cnblogs.com/lulaalu/p/18469581

相关文章

  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • Educational Codeforces Round 170 (Rated for Div. 2) D.Attribute Checks (没有完全
    算法显然为dp状态设计\(dp_{i,j}\)表示在第\(i\)个获得能力点的地方,之前智慧能力值为\(j\),时的最大分数状态转移显然需要从\(dp_{i-1,j}\)转移而来枚举\(j\in[0,i)\)则有(注意取\(\max\)操作要与自己相比较)设第\(i-1\)个能力点到第\(i\)个能......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • Educational Codeforces Round 170 (Rated for Div. 2) C. New Games
    题意转化找一些相邻的数(其中相邻定义为递增序下任意相邻两数差\(\leq1\))求相邻数中,不同数字有\(k\)种,取到数字个数的最大值算法容易想到按顺序排列观察到有点像滑动窗口,考虑用队列维护一个出现不同数字次数为\(k\)的区间,再计算代码来自转载地址voidsolv......
  • Codeforces Educational Codeforces Round 170 (Rated for Div. 2)
    A-TwoScreens大意:    给两个字符串,每次在两个空子符串进行两种操作     1、字符串末尾加一个任意字母    2、一个字符串全部复制给另一个字符串    求得到给定的两个字符串的最小操作数思路:    看最前面有多少相等即可 ......
  • Educational Codeforces Round 170 (Rated for Div. 2)
    目录写在前面A签到B结论C双指针D模拟,差分,DP,结论E计数,DP,F写在最后写在前面比赛地址:https://codeforces.com/contest/2025。妈的不想上学省赛回来昏了一天了。A签到发现最优的操作是先在一个屏幕操作得到最长公共前缀,然后复制到另一方上,再分别操作两方。特判若无公共前......
  • Splatt3R: Zero-shot Gaussian Splatting from Uncalibrated Image Pairs 论文解读
    目录一、概述二、相关工作1、近期工作2、DUSt3R3、MASt3R三、Splatt3R1、MASt3R的Backbone 2、高斯预测头3、点云与3D高斯参数结合4、3D高斯渲染5、损失函数四、实验 1、对比实验2、消融实验一、概述    该论文首次提出了一种无需任何相机参数和深......
  • FreqFed: A Frequency Analysis-Based Approach for Mitigating Poisoning Attacks in
    FreqFed:AFrequencyAnalysis-BasedApproachforMitigatingPoisoningAttacksinFederatedLearning--FreqFed:一种基于频率分析的联邦学习中缓解中毒攻击的方法来源摘要威胁模型设计目标所用方法FreqFed总结思考来源NetworkandDistributedSystemSecurity......
  • [The 3rd Ucup. Stage 10 West Lake] Generated String
    题意维护一个字符串集合,支持动态插入,动态删除,查询同时具有前缀\(s_1\)与后缀\(s_2\)的串的个数,所有字符串用如下方式给出:先给定一个全局模板串\(S\),每一个字符串都是\(S\)的若干个下标区间对应的字符串拼接而成的。即给出若干个区间\([l_1,r_1],[l_2,r_2],\dots,[l_k,r_k......
  • AT_abc374_c [ABC374C] Separated Lunch 题解
    题目传送门右侧可以传送到原题位置。题目大意题目描述由于KEYENCE总部的员工越来越多,他们决定将总部各部门分成两组,错开午休时间。KEYENCE总部有NNN个部门,第......