Codeforces Round 919 (Div. 2)(A-D)

这篇具有很好参考价值的文章主要介绍了Codeforces Round 919 (Div. 2)(A-D)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目地址:https://codeforces.com/contest/1920

Problems A. Satisfying Constraints

思路

题目给出若干约束,求符合要求的数字个数。

若为1,则大于等于该约束;若为2,则小于等于该约束;若为3,则不能等于该约束。

对于前两种情况,统计最大左边界和最小右边界;对于第三种情况,存入数组中。然后统计在边界内的第三种情况的个数,最后用边界内数字个数减去区间内第三种情况的个数即可。

标程

void Solved() {
    int n; cin >> n;
    int mx = INF, mi = 0;
    vector<int> a;
    for(int i = 0; i < n; i ++ ) {
        int x, y; cin >> x >> y;
        if(x == 1) {
            mi = max(mi, y);
        } else if(x == 2) {
            mx = min(mx, y);
        } else {
            a.push_back(y);
        }
    }
    int sum = 0;
    for(auto i : a) {
        if(i >= mi && i <= mx) sum ++;
    }
    int res = mx - mi + 1 - sum;
    
    cout << max(res, 0) << endl;
}

Problems B. Summation Game

思路

简单博弈,因为每人只操作一次,Bob希望结果数组之和最小,Bob会将前 x x x大的数都变为负,那么我们就只需要考虑Alice需要删除多少数字才能让结果数组之和最大。那么我们只需枚举 k k k次即可,对应Alice删除 0... k 0...k 0...k个数字,要使Bob取反后的数组之和最大,那么Alice删除数字将会按照从大到小的顺序。

标程

#define int long long
void Solved() {
    int n, k, x; cin >> n >> k >> x;
    vector<int> a(n + 1), b(n + 1);
    int res = -INF;
 
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    sort(a.begin() + 1, a.end());
    for(int i = 1; i <= n; i ++ ) {
        b[i] = a[i] + b[i - 1];
    }
 
    for(int i = n; i >= n - k; i -- ) {
        int j = max(0ll, i - x);
        res = max(res, b[j] - (b[i] - b[j]));
    }
 
    cout << res << endl;
}

Problems C. Partitioning the Array

思路

本题是一道同余数论。给定长度为 n n n的数组 a a a,然后将数组均分为若干份,如果当前分法可以找到每个子份对同一个数字取余后都相等,则分数加一,问能加多少分?

  1. 同余: 两个整数 a 、 b a、b ab,如果他们同时除以一个自然数 m m m,所得的余数相同,则称 a 、 b a、b ab对于模 m m m同余,记作 a ≡ b ( m o d . m ) a≡b(mod.m) abmod.m
  2. 关于将数组均分为若干份,我们可以直接枚举即可。
  3. 而判断当前所有组是否可以对同一个数字取余后相等,需要遍历一遍数组。

标程

void Solved() {
    int n; cin >> n;
    vector<int> a(n);

    for(auto &i : a) cin >> i;

    int res = 0;
    for(int i = 1; i <= n; i ++ ) {
        if(n % i == 0) {
            int g = 0;
            for(int j = i; j < n; j ++ ) {
                g = gcd(g, a[j] - a[j - i]);
            }
            res += (g != 1);
        }
    }
    
    cout << res << endl;   
}

Problems D. Array Repetition

思路

本题首先给出 n , q n,q n,q,然后给出 n n n次操作,每次操作有两种:1. 在数组后面添上一个数字 x x x,2. 将已有数组复制到数组后面 x x x次。然后有 q q q次查询,每次查询要求输出数组当前元素的值。

由于数组长度将会非常大,因此我们不能考虑模拟。

  1. 我们可以记录每次操作过后的数组长度。
  2. 每次查询是直接查询数组下标,因此我们可以找到第一个令数组长度大于该下标的操作。
  3. 注意当数据比较大时会爆 l o n g l o n g long long longlong,因此在读入的时候要注意。
  4. 如果将所有数据(操作、当前数组长度)一起存,然后二分查找,这样会导致超时。

我们可以在读入的时候记录该次操作后的数组长度,然后记录该操作的 x x x,用来最后输出。每次查询的时候找到对应的操作,若是第二种操作,则将本次查询的下标对上一次操作的数组长度取模。最后必然找出的是第一次操作,输出即可。文章来源地址https://www.toymoban.com/news/detail-797266.html

标程

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

    ll dp[n + 1] = {};
    int lstAdd[n + 1] = {};
    vector<int> pos;

    for (int i = 1, doAdd = true; i <= n; i++){
        int a, v; cin >> a >> v;

        if (a == 1) {
            lstAdd[i] = v;
            dp[i] = dp[i - 1] + 1;
        } else {
            lstAdd[i] = lstAdd[i - 1];
            dp[i] = ((v + 1) > 2e18 / dp[i - 1]) ? (ll)2e18 : dp[i - 1] * (v + 1);

            if (doAdd) pos.push_back(i);
        }
        if (dp[i] == 2e18) doAdd = false;
    }
    while (q--){
        ll k; cin >> k;

        for (int i = pos.size() - 1; i >= 0; i--){
            int idx = pos[i];

            if (dp[idx] > k && dp[idx - 1] < k){
                if (k % dp[idx - 1] == 0){
                    k = dp[idx - 1]; break;
                }
                k %= dp[idx - 1];
            }
        }
        cout << lstAdd[lower_bound(dp + 1, dp + n + 1, k) - dp]<<" \n"[q == 0];
    }
}

超时代码(思路较直观)

#define int long long
struct arr{int x, y, z;};
arr a[N];
int n, q, sum;
 
int find(int m) {//找第一个大于m的a[i].z
    int l = 1, r = n, mid;
    while(l < r) {
        mid = (l + r) / 2;
        if(a[mid].z < m) l = mid + 1;
        else r = mid;
    }
    return l;
}
 
void Solved() {
    cin >> n >> q;
    for(int i = 1; i <= n; i ++ ) {
        cin >> a[i].x >> a[i].y;
        if(a[i].x == 1) a[i].z = a[i - 1].z + 1;
        else {
            if((a[i].y > 2e18 / a[i - 1].z) && !sum){
                a[i].z = 2e18;
                sum = i;
            } else {
                a[i].z = a[i - 1].z * (a[i].y + 1);
            }
        }
    }
    while(q -- ) {
        int m; cin >> m;
        int t = find(m);
        while(a[t].x == 2) {
            m %= a[t - 1].z;
            if(m == 0) m = a[t - 1].z;
 
            t = find(m);
        }
        cout << a[t].y << " ";
    }
    cout << endl;
}

到了这里,关于Codeforces Round 919 (Div. 2)(A-D)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Codeforces Round 868 Div 2

    要求构造一个仅包含 (1) 和 (-1) 的长度为 (n) 的数组 (a) ,使得存在 (k) 个下标对 ((i, j), i j) 满足 (a_i times a_j = 1) 。 当有 (x) 个 (1) , (y) 个 (-1) 时,其满足条件的下标对数量为 (frac{x (x - 1)}{2} + frac{y (y - 1)}{2}) 。 由于 (n) 只有 (100) ,直接枚举 (x) 即可。

    2024年02月01日
    浏览(43)
  • Codeforces Round 871 (Div. 4)

    给定n个长度为10的字符串,问其与codeforces字符串的对应下标字母不同的个数。 对于每个字符串从前往后依次和“codeforces”对应字符比较然后统计不同字母数即可 给定长度为n的数组,问连续相邻为0的最大长度 维护一个全局最大长度res,和当前连续序列的长度cnt。从前往后扫

    2024年02月03日
    浏览(51)
  • Codeforces Round 867 (Div. 3)

    从所有a[i]+i-1=t的选择种取个max即可 实际上就是取同符号乘积的最大值 找规律,发现结果与边长n的关系是:res = n * (n + 3) - (n - 2) ①当n为奇数时,除了1其他均无解 ②当n为偶数时,我们可以构造一个形如n,1,n - 2,3,...的数列 首先我们可以发现n必定出现在起始位置。如果n不在起

    2024年02月02日
    浏览(45)
  • Codeforces Round 881 (Div. 3)

    给定一个数组,给每个元素涂色。求最大的代价。 代价为每个颜色的代价和。 每个颜色的代价为涂了该颜色的元素的极差。 因为是极差,每个元素要么对答案有正的贡献,要么有负的贡献,要么无贡献。且正负贡献的个数要相同。 因为要最大值,自然就是想有正贡献的是最

    2024年02月09日
    浏览(41)
  • Codeforces Round 912 (Div. 2)

    大等于2依据冒泡排序即可排序,因此判断下1即可 对每一个数字找哪一位肯定为0填0其他的填1 从后往前考虑加到当前集合或新立一个集合 从最高位开始考虑能否为1,计算能否时每个数当前位为1

    2024年02月04日
    浏览(43)
  • Codeforces Round 882 (Div. 2)

    目录 A. The Man who became a God  题目分析: B. Hamon Odyssey 题目分析: C. Vampiric Powers, anyone? 题目分析:  n个人分成k组,每一组的力量都是 这样的,那么如果分成k组那么就会有k-1个力量不被统计,将力量总和减去前k-1个最大的力量就是最小的结果   将数组分组,每个组内进行按位与

    2024年02月05日
    浏览(48)
  • Codeforces Round 894 (Div. 3)

    签到题 a数组里,大于等于前一个值的a[i]会被写到b里。直接遍历b,如果b[i]比前一个小就在它前面插一个相等的值 计算反过来的长度,判断是否相等就行 对于没有重复口味的集合,能选出的方案是n*(n-1)/2 (从n个里面选2个的组合数)。二分找出需要多少不同口味的冰淇淋,

    2024年02月11日
    浏览(43)
  • Codeforces Round 920 (Div. 3)

    Codeforces Round 920 (Div. 3) 题意:随机给出正方形在平面坐标系上的四个顶点的坐标,求正方形的面积,正方形边与xy轴平行。 思路:因为正方形与坐标轴平行,所以找出相同的两x或y坐标即可找到一条边的长度,平方就是面积,注意结果返回整型。 AC code: 题意:给出两个01字符

    2024年01月17日
    浏览(57)
  • Codeforces Round 877 (Div. 2) 题解

    写了两题了,先总结一下吧。。。看了三题,都是思维题构造题,搞心态真的搞心态。。。感觉自己屁都不会,完全没有动力。。。有的有思路但是写不出来,但是思路不够成熟,练的题太少,其实这场到B题就卡住了,C题也是,题意都能读懂,但是思考的方向不对,很焦虑

    2024年02月10日
    浏览(39)
  • Codeforces Round 889 (Div. 2) 题解

    晚上睡不着就来总结一下叭~(OoO) 终榜!!! 先不放图了。。怕被dalaoHack...呜呜呜~         7.29半夜比赛,本来是不想打的,感觉最近做的题太多了,什么牛客杭电以及CF上的题等等等,挺杂的,也来不及整理,本想梳理一下,而且也感觉今天状态不太好,但见他们都要

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包