题意

https://vjudge.net/problem/CodeForces-1257E

三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人拥有1~i的数,第二个人拥有i+1~j的数,第三个人拥有j+1~n的数,即第一个人为前缀,第二个人为中间部分,第三个人为后缀。 注意:可以有一个或两个人最后不拥有数字。

思路

先把问题简单化,考虑只有两个人的情况。设cnt1[x]表示第一个人前x个数拥有的个数,cnt2[x]表示第二个人前x个数拥有的个数,如果第一个人获得的前缀为1~i,第二个人获得的后缀为i+1~n,那么代价为cnt2[i]+cnt1[n]-cnt1[i]。

再考虑三个人的情况,同样,如果第一个人获得1~i,第二个人获得i+1~j,第三个人获得j+1~n,那么代价为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]+cnt1[n]+cnt2[n]-cnt2[j],即cnt2[i]-cnt1[i] + cnt1[n]+cnt2[n] + cnt3[j]-cnt2[j],所以枚举i,使这个式子值最小,发现还剩下两个和j有关的项对式子有影响,而j>=i,于是问题转化成了枚举i,求cnt2[i]-cnt1[i]+min(cnt3[i~n]-cnt2[i~n])+cnt1[n]+cnt2[n],我们只用维护cnt3[j]-cnt2[j]的后缀最小值即可。

注意:因为可能有一个人或两个人没有任何数,那么此时i和j是可以相等的,比如i==j时第二个人没有数,i==j==0时第1、2个人没有数,i==j==n时第二、三个人没有数,i==0&&j==n时第1、3个人没有数,等等情况

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int a[4][N];
int c[4][N],mn[N];
int main()
{
std::ios::sync_with_stdio(false);
int k1,k2,k3;
cin>>k1>>k2>>k3;
int n=k1+k2+k3;
for(int i=1;i<=k1;i++)
{
cin>>a[1][i];
++c[1][a[1][i]];
}
for(int i=1;i<=k2;i++)
{
cin>>a[2][i];
++c[2][a[2][i]];
}
for(int i=1;i<=k3;i++)
{
cin>>a[3][i];
++c[3][a[3][i]];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=3;j++)
{
c[j][i]+=c[j][i-1];
}
}
mn[n+1]=inf;
for(int i=n;i>=0;i--)
{
mn[i]=min(mn[i+1],c[3][i]-c[2][i]);
}
int ans=inf;
for(int i=0;i<=n;i++)
{
ans=min(ans,c[2][i]-c[1][i]+mn[i]+c[1][n]+c[2][n]);
// cout<<i<<" "<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}

  

CodeForces - 1257E (思维)的更多相关文章

  1. Codeforces 424A (思维题)

    Squats Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  2. Codeforces 1060E(思维+贡献法)

    https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...

  3. Queue CodeForces - 353D (思维dp)

    https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...

  4. codeforces 1244C (思维 or 扩展欧几里得)

    (点击此处查看原题) 题意分析 已知 n , p , w, d ,求x , y, z的值 ,他们的关系为: x + y + z = n x * w + y * d = p 思维法 当 y < w ...

  5. CodeForces - 417B (思维题)

    Crash Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  6. CodeForces - 417A(思维题)

    Elimination Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit  ...

  7. CodeForces 625A 思维

    题意是说一个人喝酒 有两种办法 买塑料瓶的 a块钱 喝了就没了 或者是买玻璃瓶的b块钱 喝完还能卖了瓶子c块钱 求最多能喝多少瓶 在开始判断一次 a与b-c的关系 即两种方式喝酒的成本 如果a< ...

  8. Vladik and Complicated Book CodeForces - 811B (思维实现)

    Vladik had started reading a complicated book about algorithms containing n pages. To improve unders ...

  9. The Contest CodeForces - 813A (思维)

    Pasha is participating in a contest on one well-known website. This time he wants to win the contest ...

随机推荐

  1. ABP入门教程9 - 展示层实现增删改查-视图模型

    点这里进入ABP入门教程目录 创建视图模型 在展示层(即JD.CRS.Web.Mvc)的Models下新建文件夹Course //用以存放Course相关视图模型 在JD.CRS.Web.Mvc/Mo ...

  2. JS关于日期格式转换的问题

    写Js时,有个地方用到日期,要求是yyyy--MM--dd的格式,于是想到了format函数,下面介绍了时间函数的定义,和调用前引入函数和如何格式化自己想要的日期格式. //当前时间 var Time ...

  3. nvidia quadro m5000 驱动安装 - 1804 ubuntu; nvidia-smi topo --matrix 查看gpu拓扑;nvidia-smi命令使用;

    查看GPU型号: lspci | grep -i nvidia 驱动安装: https://www.nvidia.cn/Download/index.aspx?lang=cn 下载对应版本的驱动驱动程 ...

  4. Linxu:进程的管理与进程的延迟性&周期性调度

    进程的延迟与周期调度 进程的概念 进程:开始执行但是还没有结束的程序的实例 程序:包含可执行代码的文件 进程由程序产生,是一个运行着的.要占系统资源的程序,进程不等于程序. 进程分为:交互进程.批处理 ...

  5. 操作系统|VirtualBox for Mac(虚拟机软件)

    VirtualBox是德国一家软件公司InnoTek所开发的虚拟系统软件,它不仅具有丰富的特色,而且性能也很优异,更是开源的,成为了一个发布在GPL许可之下的自由软件.VirtualBox 可以在 L ...

  6. LeetCode 1255 得分最高的单词集合 Maximum Score Words Formed by Letters

    地址 https://leetcode-cn.com/problems/maximum-score-words-formed-by-letters/ 题目描述你将会得到一份单词表 words,一个字母 ...

  7. IT人的立功,立言,立德三不朽

    最近几个月很忙,忙着当奶爸,忙着做加班狗,忙着补裤裆学技术……以至于快忘了要思考人生了! 古人立志穷极一生追求“立德”,“立功”,“立言”,以求不朽,为万世所景仰,为后人所传颂,实现人生的意义.立德者 ...

  8. 解决:Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

    简单粗暴法 删除锁 $ sudo rm /var/cache/apt/archives/lock $ sudo rm /var/lib/dpkg/lock 如果还不行,重启虚拟机 $ reboot

  9. UOJ #450. 【集训队作业2018】复读机

    前置知识单位根反演自己去浅谈单位根反演看(此外可能需要一定的生成函数的姿势) 首先一看\(d\)这么小,那我们来分类讨论一下吧 当\(d=1\)时,显然答案就是\(k^n\) 当\(d=2\)时,如果 ...

  10. RPA 案例:银行综合对账系统权限更改中的难点解决

    需求内容 根据表格中给出的信息(提供了机构名称.机构代码.用户信息.具体操作等),选择系统管理 → 用户信息管理 → 用户维护,点击用户所在的机构,在机构中选择需调整的用户,进行相应的增删改操作. 关 ...