题意

三个人,每个人有一些数字,组合起来是\(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的更多相关文章

  1. Codeforces 659B Qualifying Contest【模拟,读题】

    写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...

  2. codeforces E. The Contest(最长上升子序列)

    题目链接:https://codeforces.com/contest/1257/problem/E 题意:给三个序列k1,k2,k3,每个序列有一堆数,k1是前缀,k3是后缀,k2是中间,现可以从任 ...

  3. codeforces 659B Qualifying Contest

    题目链接:http://codeforces.com/problemset/problem/659/B 题意: n个人,m个区.给出n个人的姓名(保证不相同),属于的区域,所得分数.从每个区域中选出成 ...

  4. 【37.74%】【codeforces 725D】Contest Balloons

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. CodeForces 474B E(Contest #1)

    题意: 给你一个数n,代表n段区间,接下来有n个数(a1,a2,...an)代表每段区间的长度,第一段区间为[1,a1],第二段区间为[a1+1,a1+a2],...第i段区间为[ai-1+1,ai- ...

  6. CodeForces 546B C(Contest #1)

    Description Colonel has n badges. He wants to give one badge to every of his n soldiers. Each badge ...

  7. Codeforces April Fools Contest 2017

    都是神题,我一题都不会,全程听学长题解打代码,我代码巨丑就不贴了 题解见巨神博客 假装自己没有做过这套

  8. CodeForces - 1257E (思维)

    题意 https://vjudge.net/problem/CodeForces-1257E 三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人 ...

  9. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

  10. codeforces 725D . Contest Balloons(贪心+优先队列)

    题目链接:codeforces 725D . Contest Balloons 先按气球数从大到小排序求出初始名次,并把名次排在第一队前面的队放入优先队列,按w-t-1值从小到大优先,然后依次给气球给 ...

随机推荐

  1. 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度  222.完全二叉树的节点个数

    代码随想录算法训练营 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度  222.完全二叉树的节点个数 104.二叉树的最大深度 题目 ...

  2. 数据科学工具 Jupyter Notebook 教程(一)

    ipython notebook 是一个基于浏览器的 python 数据分析工具,使用起来非常方便,具有极强的交互方式和富文本的展示效果.jupyter 是它的升级版,它的安装也非常方便,一般 Ana ...

  3. Go语言中的结构体:灵活性与可扩展性的重要角色

    1. 引言 结构体是Go语言中重要且灵活的概念之一.结构体的使用使得我们可以定义自己的数据类型,并将不同类型的字段组合在一起,实现更灵活的数据结构.本文旨在深入介绍Go语言中的结构体,揭示其重要性和灵 ...

  4. 深入浅出MySQL事务

    Photo by Lukas Hartmann from Pexels 辞职这段时间以来看见了很多工作之外的东西,我认为这是值得的.同时也有时间和机会来好好整理所学所想,准备开启下一段旅途. 事务的定 ...

  5. Java 判断一个字符串是否是对称字符串 例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串

    代码如下: public static void main(String[] args) { String str = "1QabcdcbaQ"; StringBuilder sb ...

  6. .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)

    〇.前言 当把开发好的 WebApi 接口,部署到 Windows 服务器 IIS 后,postman 可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨 ...

  7.  Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知, 接口自动化框架V2.0,支持多业务处理,仅需维护 excel 用例,无需要编写代码

    Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知 + Jenkins 实现的接口自动化框架. 项目介绍 接 ...

  8. 【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况

    问题描述 在使用Azure Service Bus的时候,我们可以根据Queue中目前存在的消息数来判断当前消息是否有积压的情况. 但是,在Event Hub中,因为所有消息都会被存留到预先设定的保留 ...

  9. 我用numpy实现了GPT-2,GPT-2源码,GPT-2模型加速推理,并且可以在树莓派上运行,读了不少hungging face源码,手动实现了numpy的GPT2模型

    之前分别用numpy实现了mlp,cnn,lstm和bert模型,这周顺带搞一下GPT-2,纯numpy实现,最重要的是可在树莓派上或其他不能安装pytorch的板子上运行,生成数据 gpt-2的ma ...

  10. RabbitMQ基本配置

    1.用户角色配置 自带的guest/guest 超级管理员五中不同角色配置: 普通管理者(management):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理. 策略制定者(policy ...