Codeforces Round 1040 (Div. 2) A~D题解
A.Submission is All You Need
一、题意简述
给你一个长为 \(n\) 的序列 \(a\),你可以把序列中若干元素求和,或取 mex,求累加答案最大值。
二、思路
我们可以先分析 mex 操作。
我们很容易证明除了 \(0,0,...,0\) 和 \(0,1,2,...,n\) 以外的所有序列取 mex 一定会变小,而 \(0,1,2,...,n\) 取 mex 得到的答案为 \(n+1\),显然没有直接求和更优,所以除了 \(0\) 取 mex,其他都要求和。
而 \(0,0,0,...,0\) 分开取 mex 肯定是要比一起去更优,如 0 0 0 0 取 mex 为 1,而分成 4 个 0 取 mex 为 4。
三、结论&代码
所以答案很明显,把所有 0 改为 1(mex 操作),然后统一求和。
关键代码:
inline void solve()
{
int n;cin >> n;
ll ans = 0;
rep(i,1,n,1) {
int x;cin >> x;
ans += max(1,x);
}
cout << ans << endl;
}
B.Pathless
一、题意简述
给你一个由 \(0,1,2\) 组成的序列 \(a\),你最开始的位置 \(x=1\),你可以通过 \(x-1\) 或 \(x+1\) 走到 \(n\),同时你会得到 \(a_x\) 个积分,问是否有办法让我无论怎样走都不能恰好得到 \(s\) 个积分,输出方案,无解输出 -1。
二、思路
首先,对于 \(\sum a_i > s\) 的情况,怎样排都可以。
然后,对于 \(\sum a_i = s\) 的情况,输出 -1。
派出了以上两种情况,我们就可以讨论 \(\sum a_i < s\) 的情况了。
注意到一定会出现 0 1 和 1 2 至少其中之一,那么 \(sum - s = 3k\) 就能被构造出来了,可以通过 \(k\) 次 1 2 和 \(3k\) 次 0 1 来解决。
同理,会出现 0 1 和 0 2 至少其中之一,那么 \(sum - s = 2k\) 就能被构造出来了。
根据斐蜀定理的推论,我们能同时构造出 2 的倍数和 3 的倍数,就一定能构造出所有 \(> 2 \times 3 - 2 - 3\) 的数,及构造出所有大于 1 的数。
三、结论&代码
所以只有当 \(s - sum = 1\) 时,可以构造,这是我采用的构造方法:000...0111...1222...2。
核心代码:
void solve() {
int n, s;
cin >> n >> s;
vector<int> a(n + 1, 0);
int sum = 0;
int zero = 0;
int one = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
if (a[i] == 0) zero++;
if (a[i] == 1) one++;
}
if (sum == s) {
cout << -1 << endl;
return;
}
if (sum > s || sum == s - 1) {
for (int i = 1; i <= zero; i++) cout << "0 ";
int x = n - zero - one;
while (x--) cout << "2 ";
for (int i = 1; i <= one; i++) cout << "1 ";
cout << endl;
return;
}
cout << "-1" << endl;
}
C.Double Perspective
一、题意简述
给你 \(n\) 个数对 \([a_i,b_i]\),让你从中选若干个,使得区间覆盖的面积减去环的个数最大。
二、思路
我们假设现在由一条 \([a_i,b_i]\) 的边,那么我们要让覆盖的面积最大,就看这一段是否被覆盖过了。
被覆盖过:肯定不会增加覆盖的面积,但是由于 \([a_i,b_i]\) 中多了一条边,对于环的个数不会减小,还可能会增加,所以此时的最优策略是不连。
否则, \(b_i\) 一定是一个新节点或 \(a_i,b_i\) 并不在一个连通块内,此时环的个数不会增加,因为连通块之间只有一条边连着,所以此时的最优策略是连。
三、结论&代码
代码就很简单了,注意并查集别写错了
核心代码:
void init() {
for (int i = 0; i < N; i++) fa[i] = i;
}
int find(int x) {
if (x == fa[x]) return x;
return fa[x] = find(fa[x]);
}
bool is(int x, int y) {
x = find(x);
y = find(y);
return (x == y ? true : false);
}
void join(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return ;
fa[x] = y;
}
void solve() {
init();
vector<int> ans;
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int u, v;
cin >> u >> v;
if (!is(u, v)) {
ans.push_back(i);
join(u, v);
}
}
cout << ans.size() << endl;
for (auto &i : ans) cout << i << ' ';
cout << endl;
}
D.Stay or Mirror
一、题意简述
给你一个长为 \(n\) 的排列 \(p\),你需要构造一个序列 \(a\),\(a_i=p_i\) 或 \(a_i=2n-p_i\),使得序列 \(a\) 的逆序对尽可能少。
二、思路
首先我们要明确:\(p \le n\),那么 \(2p \le 2n,p\le2n - p\),所以我们选第二个相当于在放大 \(p_i\)。
为了方便,我们设 \(l_i\) 为第 \(1\sim i-1\) 元素比 \(p_i\) 大的数量,\(r_i\) 为 \(i+1\sim n\) 比 \(p_i\) 小的数量。
我们考虑当第 \(i\) 个位置选 x 时的贡献:
- 前面,所有大于 \(x\) 的,贡献为 \(l_i\)。
由于 \(2n - x\) 已经大于 \(n\) 了,所以 \(l\) 的贡献为 \(0\),所以变换后的贡献是 x 后的:
- 后面,所有大于 \(2n-x\) 的,贡献为 \(r_i\)。
证明:原来小于 \(x\) 的数会在遍历到他的时候再计算,而原来小于 \(x\) 的数在 \(x\) 变为 \(2n-x\) 的时候都会小于 \(2n-x\),所以这时候的贡献就为原来右边大于 \(2n-x\) 的元素的个数。
三、结论&代码
对于第 \(i\) 个数,选择 \(\min (l_i,r_i)\) 进行累加。
核心代码:
void slove() {
ll n;
cin >> n;
for (ll i = 1; i <= n; i++) {
cin >> s[i];
}
ll ans = 0;
for (ll i = 1; i <= n; i++) {
ll l = 0, r = 0;
for (ll j = 1; j < i; j++)
if (s[j] > s[i])l++;
for (ll j = i + 1; j <= n; j++)
if (s[j] > s[i])r++;
ans += min(l, r);
}
cout << ans << endl;
}
Codeforces Round 1040 (Div. 2) A~D题解的更多相关文章
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #672 (Div. 2) A - C1题解
[Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...
- Codeforces Round #614 (Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...
- Codeforces Round #610 (Div. 2) A-E简要题解
contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...
- Codeforces Round #611 (Div. 3) A-F简要题解
contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...
- Codeforces Round #499 (Div. 2) D. Rocket题解
题目: http://codeforces.com/contest/1011/problem/D This is an interactive problem. Natasha is going to ...
- Codeforces Round #499 (Div. 2) C Fly题解
题目 http://codeforces.com/contest/1011/problem/C Natasha is going to fly on a rocket to Mars and retu ...
- Codeforces Round #198 (Div. 2)C,D题解
接着是C,D的题解 C. Tourist Problem Iahub is a big fan of tourists. He wants to become a tourist himself, s ...
- Codeforces Round #579 (Div. 3) 套题 题解
A. Circle of Students 题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- Java子类上加lombock注解@Data或者@ToString,日志中不包括父类的属性
问题描述:Java子类上加lombock注解@Data或者@ToString,在翻阅日志的时候,发现不打印父类的属性. 问题分析:@Data在编译时会自动为实体类添加setter.getter和toS ...
- 【2020.11.14提高组模拟】无尽之前 (game) 题解
[2020.11.14提高组模拟]无尽之前 (game) 题解 有趣的题面 题目背景 雏见泽,一个和平的,或者说本应和平的小村庄,却因连续四年的怪死事件而蒙上了阴 影. 无一例外,每年的事件都发生在棉 ...
- MQ的学习记录~
MQ是一个消息中间件,是为了解决发送者和接收者处理速度不匹配的问题而产生的,有队列和主题两种. 队列:一对一. 主题:一对多.例如有100人订阅了我的公众号,当我在公众号上发布新的文章时100人都能收 ...
- PHP中的多线程与异步编程常见误区
本文由 ChatMoney团队出品 在PHP开发中,多线程和异步编程是提高应用性能和响应速度的重要手段.然而,这些技术也带来了许多挑战和陷阱,如共享状态冲突.死锁.超时.资源泄漏以及调试困难等.本文将 ...
- ArkUI-X在Android平台动态化开发指南
本文介绍如何在Android平台进行ArkUI-X动态化开发,包括动态化目录规则及约束. 适用场景 动态化主要包括两个典型场景: 场景1:框架动态化,为了降低应用ROM体积占用,及满足动态升级框架目的 ...
- 开源交流丨批流一体数据集成框架ChunJun数据传输模块详解分享
课件获取:关注公众号"ChunJun",后台私信 "课件" 获得直播课件 视频回放:点击这里 ChengYing开源项目地址:github 丨 gitee 喜欢 ...
- .NET程序员的多语言笔记本:Polyglot Notebook
大家好,我是Edison. 之前在学习机器学习的时候,使用了Jupyter Notebook这个笔记本工具,我就在想.NET这边有没有类似的,今天就跟你介绍下Polyglot Notebook这个工具 ...
- GPRS DTU
GPRS DTU ZLAN8305/ZLAN8305L是上海卓岚新推出的一款高性价比的串口232/485转GPRS DTU.这款的核心亮点是支持M级别的数据暂时存储 高性价比 支持MQTT 支持全网通 ...
- 4G DTU连接阿里云
随着物联网平台的应用越来越广泛,越来越多的用户需求数据通过4G DTU传到阿里云,然后用户从阿里云上实时获取需要的数据,本文介绍卓岚设备ZLAN8305/ZLAN5144J如何通过MQTT功能和JSO ...
- Java--连接池和分页
连接池 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 ...