首页 > 其他分享 >[CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解

[CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解

时间:2024-04-13 12:22:31浏览次数:15  
标签:Educational Rated 分块 int 题解 上取 Codeforces ans include

[CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解

A. Painting the Ribbon

最优策略是染 \(\lceil \dfrac{n}{m} \rceil\) 个颜色,然后 Bob 会把剩下的都染成这个颜色

void work() {
    int n, m, k, c;
    cin >> n >> m >> k;
    c = (n + m - 1) / m;
    cout << (k >= n - c ? "NO" : "YES") << '\n';
    return ;
}

B. Make It Ugly

波动不超过一,答案是波动间隔的 \(min\)。

int n, a[N];
vector<int> c;

void work() {
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    int x = a[1];
    a[0] = -1, a[n + 1] = -1;
    c.clear();
    c.push_back(0);
    for(int i = 1; i <= n; i ++) if(a[i] ^ x) c.push_back(i);
    c.push_back(n + 1);
    int mx = 1e9;
    for(int i = 1; i < c.size(); i ++) {
        mx = min(mx, c[i] - c[i - 1] - 1);
    }
    cout << (mx >= n ? -1 : mx) << '\n';
    
    return ;
}

C. Long Multiplication

和一定,差小积大。

D. Colored Balls

有趣的计数。

一个颜色集合的 value 是

\[\max(\max a_i, \lceil \dfrac{\sum a_i} 2 \rceil) \]

根据这个观察,我们可以计数 value 是 \(\max a_i\) 和 \(\sum\) 的。

如果把 \(a\) 排序,那么可以设计一个懂得都懂的 01 背包,然后转移前计算 \(a_i\) 的贡献即可。

sort(a + 1, a + n + 1);
f[0] = 1;
for(int i = 1; i <= n; i ++) {
    for(int j = 0; j <= a[i]; j ++)
        ans = (ans + f[j] * a[i] % mod) % mod;
    for(int j = a[i] + 1; j <= 5000; j ++)
        ans = (ans + ((j + a[i] + 1) / 2) * f[j] % mod) % mod;
    for(int j = 5000; j >= a[i]; j --)
        f[j] = (f[j] + f[j - a[i]]) % mod;
}
cout << ans << '\n';

E. Chain Reaction

\(k = 1\) 是积木大赛,\(k > 1\) 就把 \(a_i\) 除以 \(k\) 上取整之后做积木大赛。

这是一个上取整整除分块的形式,\(a\) 的变化次数是 \(O(n\sqrt V)\) 级别的,差分数组的变化也是这个级别,用整除分块找到变化的时刻然后维护答案即可。

上取整整除分块与下取整唯一的不同就是如果 \(x\bmod r =0\),那么 \(r\) 会成为下一段的左端点,其它情况都会向上加一。

稍微卡常,时间复杂度:\(O(n\sqrt V)\)。

// Problem: E. Chain Reaction
// Contest: Codeforces - Educational Codeforces Round 164 (Rated for Div. 2)
// Author: Moyou
// Copyright (c) 2024 Moyou All rights reserved.
// Date: 2024-04-12 23:31:10

#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
// #define int long long
using namespace std;
const int N = 1e5 + 10;

int n, a[N], b[N], d[N], mx;
vector<int> c[N];
long long ans;
void chk(int k, int i) {
    b[i] = (a[i] + k - 1) / k;
    if(d[i] >= 0) ans -= d[i];
    d[i] = b[i] - b[i - 1];
    if(d[i] >= 0) ans += d[i];
    if(d[i + 1] >= 0) ans -= d[i + 1];
    d[i + 1] = b[i + 1] - b[i];
    if(d[i + 1] >= 0) ans += d[i + 1];
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i], b[i] = a[i], mx = max(mx, a[i]), d[i] = a[i] - a[i - 1];
    for(int i = 1; i <= n; i ++) if(d[i] >= 0) ans += d[i];
    for(int i = 1; i <= n; i ++) {
        bool flg = 0;
        for(int l = 1, r; l <= a[i]; l = r + 1) {
            r = a[i] / (a[i] / l);
            if(!flg) c[l].push_back(i);
            else flg = 0;
            if(a[i] % r == 0) {
                if(l != r) {
                    c[r].push_back(i);
                    flg = 1;
                }
            }
        }
    }
    cout << ans << ' ';
    for(int k = 2; k <= mx; k ++) {
        for(auto i : c[k]) chk(k, i);
        cout << ans << ' ';
    }

    return 0;
}

总结

打得还行,唯一的遗憾是 E 题没写完,主要是没写过上取整整除分块调了半天,后来用 STL 帮忙写还被卡常了,只能老老实实写上取整整除分块了·。

标签:Educational,Rated,分块,int,题解,上取,Codeforces,ans,include
From: https://www.cnblogs.com/MoyouSayuki/p/18132679

相关文章

  • CF1618G Trader Problem 题解
    CF1618GTraderProblem题解题目链接:CF|洛谷提供一个在线做法。分析1我们不妨把\(a\)和\(b\)合并为一个序列,称合并后的序列为\(c\),并将其不降序排序。把玩样例后不难发现:对于一个物品序列\(c_1,c_2,\cdots,c_l\),满足\(\foralli<l,c_{i+1}-c_i\lek\)(即任意......
  • [CF1942] CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes! A~E 题解
    [CF1942]CodeTONRound8(Div.1+Div.2,Rated,Prizes!A~E题解A.FarmerJohn'sChallenge只有两种情况,一种是单调递增,这时\(k=1\),另一种是所有数都相同,这时\(k=n\)。B.BessieandMEX首位可以确定,然后从前往后增量构造\(p\)即可。voidwork(){cin>>......
  • CF1837E Play Fixing 题解
    首先来考虑什么情况方案数为\(0\):可以确定,在某一层中,两个原本都能晋级的队伍比赛;可以确定,在某一层中,两个原本都不能晋级的队伍比赛。发现假如写出每一场比赛及其胜者,可以形成一棵树形结构,在里面打标记即可判断是否为\(0\)。我们设\(a_i\)表示第\(i\)层新加的队伍中位......
  • [题解][2022年江西省大学生程序设计竞赛] Remove and append
    题目描述给定一个包含n个整数的数组a。定义一个操作如下:从数组a中选择k个整数,将它们删除,并将它们的和追加到数组末尾。如果数组A比数组B(长度相同)字典序大,那么在A和B第一次不同的位置上,A的数字比B对应位置上的数字要大。例如,[0,1,14,0]比[0,1,5,6]字典序大,因为它们在第三......
  • C++算法题解 - 递归实现排列型枚举 - 递归法 (图文) (递归搜索树)
    题目:递归实现排列型枚举把1∼n这n个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数n。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据......
  • [题解] [洛谷P7883] 平面最近点对(加强版)
    [洛谷P1429]平面最近点对(加强版)题目描述给定平面上的\(n\)个点,求其中距离最小的两个点之间的距离。输入格式第一行:\(n\),保证\(2\leqn\leq200000\)。接下来\(n\)行,每行两个实数:\(x,y\),表示一个点的横坐标和纵坐标,中间用一个空格隔开。输出格式仅一行,一个实数......
  • atcoder beginer 347 (abc347) D E 题解
     D就是二进制下,哪些位置有重合(两个1),哪些位置没有重合(1个1,1个0),剩下的都是0。xor的结果<2^60,就是小于60位(二进制下)。注意要有要求两个数需要是2^60,于是要有大小的判断,因为有的a,b会2^60,但是按照题目要求,这个情况不行。比如xor的结果,60位都是1,然后a、b各有60个1,那么需要有30个1......
  • atcoder beginer 348 (abc348) D E F 题解
     E非常经典的树上操作(树上DP)。父节点到某个子节点,值是如何变化的。1#include<cstdio>2#include<cstdlib>3#include<cstring>4#include<cmath>5#include<cstdbool>6#include<string>7#include<algorithm>8#include<iost......
  • 2024.4.10华为暑期实习笔试题解尝试1~2
    题目在4.10华为暑期实习笔试题解努力开摆的小鱼2024-04-10T1简单难度,按照题意顺着写就可以n=int(input())#表示计费日志的条数lst=[]#去重后的日志ss=set()#为了去重foriinrange(n):s=tuple(input().split(","))t=s[0]+s[1]+s[2]#......
  • 题解:P10320 勇气(Courage)
    P10320勇气(Courage)推导过程本题是一道数学题,重点是如何推导出正确式子。首先,先特判几个特殊点:当\(n>=2\)且\(x=2\)时,是不存在解的,战斗力无论何时都不会超过\(2^{n}\)。当\(x\)不强化就以大于\(2^{n}\)。当\(x\)第一次强化达到\(x^{2}\)时,大于\(2^{n}\)......