题意

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. 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变

      了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...

  2. 036.[转] JNDI 学习

    使用外置服务器(如tomcat)时,如果一个服务器启动多个项目,可以使用JNDI配置数据源,这样每个项目都可以获取到Tomcat 配置的 JNDI的数据源. 在学习 jsp 的时候,作用域对象 pag ...

  3. 微信小程序官方文档中表单组建button部分有关function(type)中type的个人理解

    官方文档关于button组件的简介 xml页面挺容易理解,但js部分起初对整体写的形式都不太理解,随着逐渐阅读代码基本理解了 xml页面代码: <button type="defaul ...

  4. django升级2.1python升级3.7时出现的错误:"trying to load '%s': %s" % (entry[1], e) django.template.library.InvalidTemplateLibrary:

    django升级2.1python升级3.7时出现如下的错误: "trying to load '%s': %s" % (entry[1], e) django.template. ...

  5. 微信小程序拒绝授权后重新拉起授权窗口

    问题: 在首次进入小程序时,我们常常会收到一些获取权限的申请,比如「获取地理位置权限」.需要微信登录时请求「获得你的公开信息(昵称.头像等)」.对于这些权限申请,开发者当然希望获得所有权限,而用户拒绝 ...

  6. android 完全区分double-tap 与 singal-tap 的方法

    需求:viewpager显示图片,需要在双击时对图片进行缩放,单击时在屏幕下方弹出popwindow,由于android的双击本质就是两次单击,但是又不想在双击时触发单击时的动作,所以就在网上各种搜解 ...

  7. 201871010116-祁英红《面向对象程序设计(java)》第八周学习总结

    项目 内容 <面向对象程序设计(java)> https://home.cnblogs.com/u/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.c ...

  8. 201871010126 王亚涛 《面向对象程序设计(java)》 第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wyt0455820/ ...

  9. ubuntu 18.04 安装mysql 遇到语言格式不兼容性问题解决

    安装mysql的时候,遇到了这样一个错误:perl: warning: Setting locale failed. perl: warning: Please check that your loc ...

  10. C++ 类的static静态成员

    静态static 静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是,全局变量或对象是有局限性的. 在全局变量前,加上关键字static该变量就被定 ...