Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)
Virtual participate 的,D题不会做,打了1:30就打不动了,过了ABCE。
A - CME
题意:?
题解:?
void test_case() {
    int n;
    scanf("%d", &n);
    if(n == 2)
        puts("2");
    else
        printf("%d\n", n & 1);
}
B - Strings Equalization
题意:给两个等长的字符串,每次可以把一个字母赋值给它前一个和后一个,问两个字符串能否变成相等。
题解:判断有没有相同的字母。
/
int cnt1[26], cnt2[26];
char s[2000], t[2000];
void test_case() {
    scanf("%s%s", s + 1, t + 1);
    for(int i = 0; i < 26; ++i)
        cnt1[i] = cnt2[i] = 0;
    int l = strlen(s + 1);
    for(int i = 1; i <= l; ++i)
        cnt1[s[i] - 'a']++;
    for(int i = 1; i <= l; ++i)
        cnt2[t[i] - 'a']++;
    for(int i = 0; i < 26; ++i) {
        if(cnt1[i] && cnt2[i]) {
            puts("YES");
            return;
        }
    }
    puts("NO");
}
C - Save the Nature
题意:电影院规定a的倍数的票的x%以及b的倍数的票的y%会捐赠出去,求捐赠出至少k元需要的最小的电影票数量。你可以任意排列这些电影票,而且a和b的公倍数会捐(x+y)%。
题解:很显然的二分题,直接二分电影票的数量t,然后取前t大的电影票出来。先贪心分给公倍数,然后贪心分给比例更大的那个,最后的全部尝试分给比例小的那个。
int n;
int p[200005];
int tp[200005];
int x, a, y, b;
ll g, k;
bool check(int t) {
    ll cur = 0;
    int i = 1;
    int restg = t / g;
    int resta = t / a - restg, restb = t / b - restg;
    while(i <= t) {
        if(restg) {
            --restg;
            cur += 1ll * tp[i] * (x + y) / 100;
        } else if(resta) {
            --resta;
            cur += 1ll * tp[i] * x / 100;
        } else if(restb) {
            --restb;
            cur += 1ll * tp[i] * y / 100;
        } else
            break;
        ++i;
    }
    return cur >= k;
}
int bs() {
    int L = 1, R = n;
    while(1) {
        int M = (L + R) >> 1;
        if(L == M) {
            if(check(L))
                return L;
            if(check(R))
                return R;
            return -1;
        }
        if(check(M))
            R = M;
        else
            L = M + 1;
    }
}
void test_case() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &p[i]);
        tp[i] = p[i];
    }
    sort(tp + 1, tp + 1 + n, greater<int>());
    scanf("%d%d%d%d%lld", &x, &a, &y, &b, &k);
    if(y > x) {
        swap(x, y);
        swap(a, b);
    }
    g = 1ll * a * b / __gcd(a, b);
    printf("%d\n", bs());
}
其实上面没有必要再开一个tp数组。而且可以求出tp数组的前缀和,这样验证就不是O(t)了而是O(1)。
int n;
ll p[200005];
int x, a, y, b;
ll g, k;
bool check(int t) {
    int rg = t / g;
    int ra = t / a - rg, rb = t / b - rg;
    ll cur = (p[rg] * (x + y) + (p[rg + ra] - p[rg]) * x + (p[rg + ra + rb] - p[rg + ra]) * y);
    return cur >= k;
}
int bs() {
    int L = 1, R = n;
    while(1) {
        int M = (L + R) >> 1;
        if(L == M) {
            if(check(L))
                return L;
            if(check(R))
                return R;
            return -1;
        }
        if(check(M))
            R = M;
        else
            L = M + 1;
    }
}
void test_case() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%lld", &p[i]);
    sort(p + 1, p + 1 + n, greater<ll>());
    for(int i = 1; i <= n; ++i)
        p[i] += p[i - 1];
    scanf("%d%d%d%d%lld", &x, &a, &y, &b, &k);
    k *= 100;
    if(y > x) {
        swap(x, y);
        swap(a, b);
    }
    g = 1ll * a * b / __gcd(a, b);
    printf("%d\n", bs());
}
D
参考资料:https://blog.csdn.net/Dch19990825/article/details/103017653
E - Paint the Tree
题意:将一棵n个节点的树,边带正权,每个节点染恰好k种颜色,且每种颜色至多染2个节点,问最大权值的染色方法。
题解:一开始往生成树那里想了,以为是先取权最大的边贪心,这个反例很好举的,怎么会这么演呢?后面想了想会不会是树形dp呢?只需要考虑儿子的颜色满了和没满两种情况,而根本不关心子树的细节。
所以设置dp[u][0]为u节点颜色没满的以u为根的子树的最大权和,dp[u][1]为u节点的颜色满了或没满的最大权和,所以dp[u][1]>=dp[u][0]。
先特判掉没有边的情况,免得乱七八糟的。然后度为1的点也不是根节点的点就一定是叶子,叶子直接返回。
否则,一棵树肯定是可以不取去往子树的边的,所以直接取dp[v][1]出来,同时假如取子树的边,那么值会增加:w+dp[v][0]-dp[v][1],把这个存在每层dfs中的tmp数组里,假如怕爆栈就放在tmp[u]中就可以了(这里确实会怕爆栈的问题?不太清楚vector是怎么分配空间的,分配的是堆空间还是栈空间?),这里可以不取ll,因为dp[v][0]和dp[v][1]的差应该不太会超过一条边的权(感觉是因为dp[v][1]最多就是比dp[v][0]多取了一条边罢了,不过最好下次还是要用ll)。
对tmp数组排序。取出最大的最多k-1个更新dp[u][0]和dp[u][1],假如还有第k个可以再更新dp[u][1]。
int n, k;
vector<pii>G[500005];
ll dp[500005][2];
void dfs(int u, int p) {
    if(G[u].size() == 1 && p != -1) {
        //printf("dp[%d][%d]=%lld\n", u, 0, dp[u][0]);
        //printf("dp[%d][%d]=%lld\n", u, 1, dp[u][1]);
        return;
    }
    vector<pii>tmp;
    for(auto &e : G[u]) {
        int v = e.first, w = e.second;
        if(v == p)
            continue;
        dfs(v, u);
        dp[u][0] += dp[v][1];
        dp[u][1] += dp[v][1];
        if(w + dp[v][0] - dp[v][1] > 0)
            tmp.push_back({w + dp[v][0] - dp[v][1], v});
    }
    sort(tmp.begin(), tmp.end(), greater<pii>());
    int c = min((int)tmp.size(), k - 1);
    for(int i = 0; i < c; ++i) {
        dp[u][0] += tmp[i].first;
        dp[u][1] += tmp[i].first;
    }
    dp[u][1] += tmp.size() >= k ? tmp[k - 1].first : 0;
    //printf("dp[%d][%d]=%lld\n", u, 0, dp[u][0]);
    //printf("dp[%d][%d]=%lld\n", u, 1, dp[u][1]);
    assert(dp[u][1]>=dp[u][0]);
}
void test_case() {
    scanf("%d%d", &n, &k);
    if(n == 1) {
        puts("0");
        return;
    }
    for(int i = 1; i <= n; ++i) {
        dp[i][0] = 0;
        dp[i][1] = 0;
        G[i].clear();
    }
    for(int i = 1; i <= n - 1; ++i) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        G[u].push_back({v, w});
        G[v].push_back({u, w});
    }
    dfs(1, -1);
    printf("%lld\n", dp[1][1]);
}
可是我为什么写不出D呢?
Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)的更多相关文章
- Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) C. Save the Nature【枚举二分答案】
		
https://codeforces.com/contest/1241/problem/C You are an environmental activist at heart but the rea ...
 - Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) D. Sequence Sorting
		
链接: https://codeforces.com/contest/1241/problem/D 题意: You are given a sequence a1,a2,-,an, consistin ...
 - Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) B. Strings Equalization
		
链接: https://codeforces.com/contest/1241/problem/B 题意: You are given two strings of equal length s an ...
 - Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) C. Save the Nature
		
链接: https://codeforces.com/contest/1241/problem/C 题意: You are an environmental activist at heart but ...
 - Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) A. CME
		
链接: https://codeforces.com/contest/1241/problem/A 题意: Let's denote correct match equation (we will d ...
 - Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) 题解
		
A..B略 C 对当前的值排序,再二分答案,然后对于(i%x==0 && i%y==0)放入大的,再放其他的贪心解决即可. #include<iostream> #incl ...
 - Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
		
A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...
 - Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3
		
A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...
 - 【cf比赛记录】Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
		
比赛传送门 只能说当晚状态不佳吧,有点头疼感冒的症状.也跟脑子没转过来有关系,A题最后一步爆搜没能立即想出来,B题搜索没有用好STL,C题也因为前面两题弄崩了心态,最后,果然掉分了. A:简单数学 B ...
 
随机推荐
- SS L服务
			
WebHttpBinding _binding = new WebHttpBinding(); WebServiceHost ws = new WebServiceHost(typeof(Servic ...
 - TextBox  显示横线
			
public class Xtxt3 : TextBox { private bool m_underLine; public bool UnderLine { get { return m_unde ...
 - 3_PHP表达式_2_变量
			
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP变量可分为自定义变量和预定义变量. 以下所谈到的变量均为自定义变量. 1.变量的基本概念 PHP的变量名遵循 ...
 - iOS 中各种横竖屏切换总结
			
iOS 中横竖屏切换的功能,在开发iOS app中总能遇到.以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰到了,demo尝试了几种情况,这里就做下总结.注意 横屏两种情况是反的你知道吗? UI ...
 - 【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体
			
在C#的List集合的操作中,有时候我们需要根据相关条件快速从List集合中获取到第一个符合条件的实体对象,例如有个全校班级的List集合,我们需要根据班级代码快速从List集合中查找出班级信息.可以 ...
 - php上传文件报错以及对应代号信息-转载http://jewel-m.iteye.com/blog/1210344
			
用PHP上传文件时,我们会用程序去监听浏览器发送过来的文件信息,首先会通 过$_FILES[fieldName]['error']的不同数值来判断此欲上传的文件状态是否正常.$_FILES[field ...
 - 回忆一下Node(随时更改,想到什么写什么)
			
什么是Node? Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效 事件驱动: 任务执行,发布者 ...
 - DBCP连接池原理分析(转载)
			
DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...
 - Jenkins安装Slave节点
			
在系统管理----节点管理下 创建完成后会出现slave节点启动的命令,下载agent.jar,然后启动服务 Master-slave相当于Server和Agent,master管理job和slave ...
 - Zookeeper监控平台
			
JMX: 安装配置 1.修改zookeeper的启动脚本 vi zkServer.sh 找到启动参数ZOOMAIN  修改为下面值(修改一项,新增4项): -Dcom.sun.management ...