Codeforces 1257E - The Contest
题意
三个人,每个人有一些数字,组合起来是\(1\)-\(n\),每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人拥有\(1\)-\(i\)的数,第二个人拥有\(i+1\)-\(j\)的数,第三个人拥有\(j+1\)~\(n\)的数,即第一个人为前缀,第二个人为中间部分,第三个人为后缀。
注意:可以有一个或两个人最后不拥有数字。
分析
看到三个人操作,我们先看两个人操作时的情况:
假设到最后,第一个人拥有\(1\)-\(i\),第二个人拥有\(i+1\)-\(n\),那么最小操作数为第二个人\(1\)-\(i\)中拥有的数字加上第一个人\(i+1\)-\(n\)中拥有的数字。我们可以采用前缀和,\(cnt1[k]\)表示第一个人前\(k\)个数中拥有的个数,\(cnt2[k]\)表示第二个人前\(k\)个数中拥有的个数,则表达式为:$$cnt2[i]+cnt1[n]-cnt1[i]$$受到启发我们看三个人操作时的情况:
假设到最后,第一个人拥有\(1\)-\(i\),第二个人拥有\(i+1\)~\(j\),第三个人拥有\(j+1\)-\(n\),那么最小操作数为第二个人和第三个人\(1\)-\(i\)中拥有的个数加上第一个人和第三个人\(i+1\)-\(j\)中拥有的个数加上第一个人和第二个人\(j+1\)-\(n\)中拥有的个数。我们可以采用前缀和,\(cnt1[k]\)表示第一个人前\(k\)个数中拥有的个数,\(cnt2[k]\)表示第二个人前\(k\)个数中拥有的个数,\(cnt3[k]\)表示第三个人前\(k\)个数中拥有的个数字表达式为:$$cnt2[i]+cnt3[i]+cnt1[j]-cnt1[i]+cnt3[j]-cnt3[i]+cnt1[n]-cnt1[j]+cnt2[n]-cnt2[j]$$化简得到:$$cnt2[i]-cnt1[i]+cnt3[j]-cnt2[j]+cnt1[n]+cnt2[n]$$我们从\(0\)-\(n\)枚举\(i\),接下来我们考虑\(j\)的取值,我们可以看到对于固定的\(i\),只需要找到一个\(j\)使得该式子最小即可,那么我们可以设置一个后缀\(minn[]\)数组,\(minn[i]\)表示当\(i\leq j\leq n\)时,\(cnt3[j]-cnt2[j]\)最小的值,那么答案即为:$$cnt2[i]-cnt1[i]+minn[i]+cnt1[n]+cnt2[n]$$
代码
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define LL long long
using namespace std;
const int maxn = (ll) 2e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
int cnt1[maxn], cnt2[maxn], cnt3[maxn];
int minn[maxn];
vector<int> v1, v2, v3;
int main() {
start;
int k1, k2, k3;
cin >> k1 >> k2 >> k3;
v1.resize(k1 + 5);
v2.resize(k2 + 5);
v3.resize(k3 + 5);
/*输入并标记*/
for (int i = 1; i <= k1; ++i) {
cin >> v1[i];
++cnt1[v1[i]];
}
for (int i = 1; i <= k2; ++i) {
cin >> v2[i];
++cnt2[v2[i]];
}
for (int i = 1; i <= k3; ++i) {
cin >> v3[i];
++cnt3[v3[i]];
}
int n = k1 + k2 + k3;
for (int i = 1; i <= n; ++i) {//前缀和
cnt1[i] = cnt1[i - 1] + cnt1[i];
cnt2[i] = cnt2[i - 1] + cnt2[i];
cnt3[i] = cnt3[i - 1] + cnt3[i];
}
/*如分析*/
for (int i = 0; i <= n; ++i)
minn[i] = cnt3[i] - cnt2[i];
for (int i = n - 1; i >= 0; --i)
minn[i] = min(minn[i + 1], minn[i]);
int ans = inf;
for (int i = 0; i <= n; ++i) {
int t = cnt2[i] - cnt1[i] + minn[i] + cnt1[n] + cnt2[n];
ans = min(ans, t);
}
cout << ans;
return 0;
}
本场比赛\(D\)和\(E\)惨痛教训:玩后缀一定要注意边界!!!
若有问题可在评论区提出,谢谢。
Codeforces 1257E - The Contest的更多相关文章
- Codeforces 659B Qualifying Contest【模拟,读题】
写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...
- codeforces E. The Contest(最长上升子序列)
题目链接:https://codeforces.com/contest/1257/problem/E 题意:给三个序列k1,k2,k3,每个序列有一堆数,k1是前缀,k3是后缀,k2是中间,现可以从任 ...
- codeforces 659B Qualifying Contest
题目链接:http://codeforces.com/problemset/problem/659/B 题意: n个人,m个区.给出n个人的姓名(保证不相同),属于的区域,所得分数.从每个区域中选出成 ...
- 【37.74%】【codeforces 725D】Contest Balloons
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CodeForces 474B E(Contest #1)
题意: 给你一个数n,代表n段区间,接下来有n个数(a1,a2,...an)代表每段区间的长度,第一段区间为[1,a1],第二段区间为[a1+1,a1+a2],...第i段区间为[ai-1+1,ai- ...
- CodeForces 546B C(Contest #1)
Description Colonel has n badges. He wants to give one badge to every of his n soldiers. Each badge ...
- Codeforces April Fools Contest 2017
都是神题,我一题都不会,全程听学长题解打代码,我代码巨丑就不贴了 题解见巨神博客 假装自己没有做过这套
- CodeForces - 1257E (思维)
题意 https://vjudge.net/problem/CodeForces-1257E 三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人 ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
- codeforces 725D . Contest Balloons(贪心+优先队列)
题目链接:codeforces 725D . Contest Balloons 先按气球数从大到小排序求出初始名次,并把名次排在第一队前面的队放入优先队列,按w-t-1值从小到大优先,然后依次给气球给 ...
随机推荐
- PTA L1-064 估值一亿的AI核心代码
PTA L1-064 估值一亿的AI核心代码 有坑!不少 题目链接 题目及分析 题目: 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 1. 无论用户说什么,首先把对方说 ...
- HTML入门笔记1
一.HTML是谁发明的? 1990年Tim Berners Lee发明了www(world wide web万维网),为了方面人们于阅读网页,与此同时自己又发明了HTML.HTTP.URL:用自己写的 ...
- 大幅提升前端工作效率!Numeral.js数值格式化库来了!
我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和 ...
- C2简介
C2简介 学习命令与控制的基本知识,帮助您成为更好的红队队员并简化您的下一次红队评估! thm:https://tryhackme.com/room/introtoc2 介绍 命令与控制 ( C2 ) ...
- jenkins中的坑_CreateProcess error=1392
环境:windows11,jdk1.8,jenkins_2.346.war 起因 最近在使用jenkins部署项目的时候,填写仓库的url地址时,发现填完后报500这个错误,于是我打开jenkins的 ...
- C#里的var和dynamic区别到底是什么,你真的搞懂了嘛
前言 这个var和dynamic都是不确定的初始化类型,但是这两个本质上的不同.不同在哪儿呢?var编译阶段确定类型,dynamic运行时阶段确定类型.这种说法对不对呢?本篇看下 概括 以下详细叙述下 ...
- Cronjob 定时任务
Job: 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束. CronJob: 则就是在Job上加上了时间调度. 我们用Job这个资源对象来创建一个任务,我们定一个Job来 ...
- ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作--登录和注销.ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用 ...
- GetX 关于报错 Null check operator used on a null value的解决
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'logic.dart'; class Ge ...
- “easyExcel”导入的代码实现
使用easyExcel在导入数据事有很好的使用性,方便操作. 添加依赖: <dependency> <groupId>com.alibaba</groupId> & ...