2024.12.2 Educational Codeforces Round 172

Solved: 4/6

Upsolved: 5/6

Rank: 205


脑洞题做多了导致套路题不会做了。。。


A. Greedy Monocarp

题意:给一个序列,每次可以给其中一个数加1,问最少操作多少次可以满足当从大到小取数时取到的数之和会恰好等于 \(k\)

从大到小排序,设恰好小于 \(k\) 的前缀和为 \(s\),答案就是 \(k-s\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()void solve(){int n,k;cin>>n>>k;vector<int> a(n);ll sum=0,ans=-1;for(int& x:a)cin>>x,sum+=x;sort(all(a));for(int i=0;i<n;++i){if(sum<=k){ans=k-sum;break;}sum-=a[i];}cout<<ans<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);int T;cin>>T;while(T--)solve();
}

B. Game with Colored Marbles

题意:有一个序列,两人轮流取数。先手每取到一个值都会得 1 分,如果取到某个值的所有数又会额外得 1 分。先手希望得分最多,后手希望得分最少。问最优策略下的分数。

最优策略下,一定是先取完所有出现次数为 1 的数(先手会取得 \(\lceil \frac{c+1}2\rceil\) 个),再取剩下的(先手每个数都会取到但都不会取完)。答案就是出现的值的数量加(出现次数为 1 的数的数量 mod 2)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()void solve(){int n,x;cin>>n;vector<int> c(n+1);for(int i=0;i<n;++i)cin>>x,++c[x];int cnt1=0,cnt2=0;for(int i=1;i<=n;++i){if(c[i]==1)++cnt1;else if(c[i]>1)++cnt2;}cout<<cnt1+(cnt1&1)+cnt2<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);int T;cin>>T;while(T--)solve();
}

C. Competitive Fishing

题意:有一个 \(\pm 1\) 序列,给每个位置赋一个连续且单调不降的自然数权值(即 00111223333 这样的),使得所有数字与权值的乘积之和至少为 \(k\),求最大权值的最小值。

每个权值增加的位置对答案的贡献是从这个位置开始的后缀和。因此给所有后缀和排序,从大到小加直到超过 \(k\) 为止即可(注意第一个位置不能加)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()void solve(){int n,k;cin>>n>>k;string a;cin>>a;vector<int> s(n);for(int i=n-1;i;--i)s[i-1]=s[i]+(a[i]=='1'?1:-1);s.pop_back();sort(all(s));int m=1,sum=0;for(int i=n-2;~i;--i){if(sum>=k)break;sum+=s[i],++m;}if(sum<k)cout<<"-1\n";else cout<<m<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);int T;cin>>T;while(T--)solve();
}

D. Recommendations

题意:有 \(n\) 个区间。对每个区间,求所有覆盖它的区间的交的长度减去它本身的长度。

对所有区间按左端点从小到大排序,用set维护右端点,枚举到一个区间时其右端点的lower_bound就是覆盖区间交的右端点。反过来做一遍即可得到区间交的左端点。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define all(x) (x).begin(),(x).end()struct node{int l,r,id;};void solve(){int n;cin>>n;vector<node> a(n);for(int i=0;i<n;++i)cin>>a[i].l>>a[i].r,a[i].id=i;sort(all(a),[=](node a,node b){return a.l<b.l||a.l==b.l&&a.r>b.r;});set<int> s;vector<int> l(n),r(n);for(int i=0;i<n;++i){auto it=s.lower_bound(a[i].r);if(it==s.end())r[a[i].id]=-1;else r[a[i].id]=*it;if(i<n-1&&a[i].l==a[i+1].l&&a[i].r==a[i+1].r)r[a[i].id]=-1;s.insert(a[i].r);}s.clear();sort(all(a),[=](node a,node b){return a.r>b.r||a.r==b.r&&a.l<b.l;});for(int i=0;i<n;++i){auto it=s.upper_bound(a[i].l);if(it==s.begin())l[a[i].id]=-1;else l[a[i].id]=*(--it);if(i<n-1&&a[i].l==a[i+1].l&&a[i].r==a[i+1].r)l[a[i].id]=-1;s.insert(a[i].l);}sort(all(a),[=](node a,node b){return a.id<b.id;});for(int i=0;i<n;++i){if(l[i]==-1||r[i]==-1)cout<<"0\n";else cout<<(r[i]-l[i])-(a[i].r-a[i].l)<<'\n';}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);int T;cin>>T;while(T--)solve();
}

E. Vertex Pairs

题意:给一棵 \(2n\) 个节点的树,每个节点的权值为 \(1\sim n\) 且每个值恰好出现 \(2\) 次。编号为 \(i\) 的节点的费用为 \(2^i\),求费用最小的包含所有权值的连通集合。

首先可以注意到:因为集合的大小至少为 \(n\),超过总点数的一半,所以这个集合一定至少包含一个重心。

以重心为根(如果有两个重心要分别做一遍)。从大到小枚举节点看是否可以删除。因为答案集合一定包含重心,所以要删除一个点只能删除以它为根的整棵子树。

考虑如何快速判断能否删除。dfs序将子树转化为区间,然后用树状数组维护每个位置的值是否能被删除:

  • 每个值的两个点的lca一定不能被删除;

  • 若一个值的两个点有一个点被删了,那么另一个点不能再被删。

删除过程中维护树状数组,判断时判区间和大于0即可。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845711.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费实时翻译软件-MTtranslator

MTtranslator 基于win11的实时字幕(Live Captions),利用本地大模型(Helsinki-NLP/opus-mt-en-zh)实现实时翻译功能。功能特点仅支持英文到简体中文翻译该应用专为实时字幕翻译设计,支持从英文到简体中文的转换。离线操作翻译完全离线进行,保证隐私安全。但翻译质量仅供参…

Educational Codeforces Round 172 (Rated for Div. 2)

A. Greedy Monocarp题目大意:给你n个箱子,每个箱子有ai枚硬币,现在有一个人会进行若干次操作:每次拿走硬币最多的箱子,直到他的硬币总和大于等于k。 你可以在一些箱子内增加一些硬币,使得这个人拿走的硬币数量最小,问你最少需要加多少枚硬币。思路: 看数据范围,ai<…

HCIP-15 BGP路由反射器

为解决IBGP水平分割问题可以采用全互联的IBGP连接,但是该方式需要维护大量的IBGP对等体关系,为此可以部署RR来减少IBGP对等体关系的数量。 RR的设定打破了IBGP水平分割规则,为了防止路由环路产生,BGP增加了Originator_ID、Cluster_ID两个路径属性。目录中转AS中的IBGP问题路…

财务知识-期末常用会计分录

财务知识-期末常用会计分录

Rancher容器云管理平台

Rancher容器云管理平台 一、主机硬件说明序号 硬件 操作及内核1 CPU 4 Memory 4G Disk 100G CentOS72 CPU 4 Memory 4G Disk 100G CentOS73 CPU 4 Memory 4G Disk 100G CentOS74 CPU 4 Memory 4G Disk 100G CentOS7二、主机配置 2.1 主机名 # hostnamectl set-hostname rancher…

《痞子衡嵌入式半月刊》 第 112 期

痞子衡嵌入式半月刊: 第 112 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

学习高校课程-系统设计与分析-优化设计(lec8)

将用例行为分发到类 对于每个事件用例流:确定分析类 ,将用例职责分配给分析类 ,在交互图中对分析类交互进行建模描述职责 做什么:创建对象,执行计算,对其他对象的初始化操作,控制和协调工作...... 知道什么:关于私有封装数据,关于相关对象,关于他可以推导和计算的事物…

使用CloudDrive 将网盘挂载本地(网盘本地化,超简单)

使用CloudDrive 将网盘挂载本地(网盘本地化,超简单) 创建时间:20241122 一、介绍 免费的,可以将两个网盘挂载在本地。可实现不用登陆即可 下载。很好用。 之前还有一个alist+RaiDrive 可以免费挂载很多(我觉得没必要懒得搞没搞那个,这个也够用了。感兴趣的可以去试试那…

manim边做边学--曲面

Surface类是Manim中专为创建和操控复杂的三维表面而打造的。 在实际应用中,无论是创建数学教学中的几何模型,还是模拟物理现象中的曲面变化,甚至是构建复杂的动画场景中的三维元素,Surface类都能以其强大的功能和灵活性满足我们的需求。 通过Surface类的参数和方法,我们可…

mac通过网线连接主机(fnOS)

一、mac端 mac是typec的,用了个转接头+网线直连主机,初始化的时候跟下面一致,默认都是自动的点击详细信息,配置IPv4选择使用DHCP二、主机端 主机端是最麻烦的,刚开始的时候怎么也找不到网卡,ifconfg敲了很多遍,最后发现是fnOS没有装驱动。。。 root@server:~# sudo lshw…

05_VIM编辑器

VIM编辑器 一、VIM编辑器的工作模式命令行模式 用户刚刚启动 vi/vim,便进入了命令模式。控制屏幕光标的移动,字符、字或行的删除,移动、复制某区域及进入插入模式,或者到末行模式插入模式 只有在插入模式下才可以做文本输入,按“ESC”键可回到命令行模式末行模式 在命令模…