洛谷题面传送门

好几天没写题解了,写篇题解意思一下(大雾

考虑反悔贪心,首先我们考虑取出 \(a,b\) 序列中最大的 \(k\) 个数,但这样并不一定满足交集 \(\ge L\) 的限制,因此我们需要调整,我们假设 \(L-\) \(a,b\) 序列中最大的 \(k\) 个数的交集为 \(L'\),如果 \(L'\le 0\) 那不用调整直接输出即可。否则我们考虑每次调整部分 \(a_i,b_i\) 的取值使得 \(a,b\) 的交集加 \(1\),不难发现每次调整可能有以下可能:

  1. 选择两个下标 \(x,y\),满足选择了 \(a_x\) 没选 \(b_x\),以及选择了 \(b_y\) 没选 \(a_y\),将 \(a_x\) 改为 \(a_y\),答案增加 \(a_y-a_x\)
  2. 选择两个下标 \(x,y\),满足选择了 \(b_x\) 没选 \(a_x\),以及选择了 \(a_y\) 没选 \(b_y\),将 \(b_x\) 改为 \(b_y\),答案增加 \(b_y-b_x\)
  3. 选择三个下标 \(x,y,z\),满足选择了 \(a_x\) 没选 \(b_x\),选择了 \(b_y\) 没选 \(a_y\),\(a_z,b_z\) 都没选,将 \(a_x\) 改为 \(a_z\),\(b_y\) 改为 \(a_z\),答案增加 \((a_z+b_z)-a_x-b_y\)
  4. 选择三个下标 \(x,y,z\),满足选择了 \(a_x\) 没选 \(b_x\),选择了 \(b_y\) 没选 \(a_y\),\(a_z,b_z\) 都被选择了,将 \(a_z\) 改为 \(a_y\),\(b_z\) 改为 \(b_x\),答案增加 \(a_y+b_x-(a_z+b_z)\)

思路理到这里,聪明的读者一定能够发现,接下来的步骤与此题第二个解法大同小异了,我们记 \(st_i\) 表示下标为 \(i\) 的位置被选择的情况,\(st_i=0\) 表示 \(a_i,b_i\) 都没选,\(st_i=1\) 表示 \(a_i\) 被选 \(b_i\) 没选,\(st_i=2\) 表示 \(b_i\) 被选 \(a_i\) 没选,\(st_i=3\) 表示 \(a_i,b_i\) 都被选。

那么考虑维护六个大根堆:

  • \(q_1=\{a_i|st_i=2\}\)
  • \(q_2=\{b_i|st_i=1\}\)
  • \(q_3=\{-a_i|st_i=1\}\)
  • \(q_4=\{-b_i|st_i=2\}\)
  • \(q_5=\{a_i+b_i|st_i=0\}\)
  • \(q_6=\{-a_i-b_i|st_i=3\}\)

对于情况 \(1\) 相当于是取出 \(q_1,q_3\) 的根节点,情况 \(2\) 相当于是取出 \(q_2,q_4\) 的根节点,情况 \(3\) 相当于是取出 \(q_3,q_4,q_5\) 的根节点,情况 \(4\) 相当于是取出 \(q_1,q_2,q_6\) 的根节点,然后 xjb 乱搞一下就行了(确信

时间复杂度线对。

感觉这个 D1T3 比 D1T2 简单,虽然我都不会做

  1. const int MAXN=2e5;
  2. int n,k,l,a[MAXN+5],b[MAXN+5],st[MAXN+5];
  3. pii ap[MAXN+5],bp[MAXN+5];
  4. priority_queue<pii> q1,q2,q3,q4,q5,q6;
  5. /*
  6. q1: maximum a[i] with st[i]=2
  7. q2: maximum b[i] with st[i]=1
  8. q3: maximum -a[i] with st[i]=1
  9. q4: maximum -b[i] with st[i]=2
  10. q5: maximum a[i]+b[i] with st[i]=0
  11. q6: maximum -a[i]-b[i] with st[i]=3
  12. */
  13. void solve(){
  14. scanf("%d%d%d",&n,&k,&l);memset(st,0,sizeof(st));
  15. for(int i=1;i<=n;i++) scanf("%d",&a[i]),ap[i]=mp(a[i],i);
  16. for(int i=1;i<=n;i++) scanf("%d",&b[i]),bp[i]=mp(b[i],i);
  17. sort(ap+1,ap+n+1);reverse(ap+1,ap+n+1);
  18. sort(bp+1,bp+n+1);reverse(bp+1,bp+n+1);ll ans=0;
  19. for(int i=1;i<=k;i++) st[ap[i].se]|=1,ans+=ap[i].fi;
  20. for(int i=1;i<=k;i++) st[bp[i].se]|=2,ans+=bp[i].fi;
  21. for(int i=1;i<=n;i++) l-=(st[i]==3);chkmax(l,0);
  22. q1.push(mp(-2e9,0));q2.push(mp(-2e9,0));q3.push(mp(-2e9,0));
  23. q4.push(mp(-2e9,0));q5.push(mp(-2e9,0));q6.push(mp(-2e9,0));
  24. for(int i=1;i<=n;i++){
  25. if(st[i]==2){
  26. q1.push(mp(a[i],i));
  27. q4.push(mp(-b[i],i));
  28. } if(st[i]==1){
  29. q2.push(mp(b[i],i));
  30. q3.push(mp(-a[i],i));
  31. } if(!st[i]){
  32. q5.push(mp(a[i]+b[i],i));
  33. } if(st[i]==3){
  34. q6.push(mp(-a[i]-b[i],i));
  35. }
  36. }
  37. while(l--){
  38. #define qpop(a,b)\
  39. while(!q##a.empty()){\
  40. int x=q##a.top().se;\
  41. if(!x||st[x]==b) break;\
  42. q##a.pop();\
  43. }
  44. qpop(1,2);qpop(2,1);qpop(3,1);
  45. qpop(4,2);qpop(5,0);qpop(6,3);
  46. ll res1=0ll+q1.top().fi+q3.top().fi;
  47. ll res2=0ll+q2.top().fi+q4.top().fi;
  48. ll res3=0ll+q3.top().fi+q4.top().fi+q5.top().fi;
  49. ll res4=0ll+q1.top().fi+q2.top().fi+q6.top().fi;
  50. ll mx=max(max(res1,res2),max(res3,res4));ans+=mx;
  51. if(res1==mx){
  52. int x=q1.top().se,y=q3.top().se;
  53. q1.pop();q3.pop();st[x]=3;st[y]=0;
  54. q5.push(mp(a[y]+b[y],y));
  55. q6.push(mp(-a[x]-b[x],x));
  56. } else if(res2==mx){
  57. int x=q2.top().se,y=q4.top().se;
  58. q2.pop();q4.pop();st[x]=3;st[y]=0;
  59. q5.push(mp(a[y]+b[y],y));
  60. q6.push(mp(-a[x]-b[x],x));
  61. } else if(res3==mx){
  62. int x=q3.top().se,y=q4.top().se,z=q5.top().se;
  63. q3.pop();q4.pop();q5.pop();st[x]=st[y]=0;st[z]=3;
  64. q5.push(mp(a[x]+b[x],x));
  65. q5.push(mp(a[y]+b[y],y));
  66. q6.push(mp(-a[z]-b[z],z));
  67. } else{
  68. int x=q1.top().se,y=q2.top().se,z=q6.top().se;
  69. q1.pop();q2.pop();q6.pop();st[x]=st[y]=3;st[z]=0;
  70. q6.push(mp(-a[x]-b[x],x));
  71. q6.push(mp(-a[y]-b[y],y));
  72. q5.push(mp(a[z]+b[z],z));
  73. }
  74. } printf("%lld\n",ans);
  75. #define clr(x) while(!q##x.empty()) q##x.pop();
  76. clr(1);clr(2);clr(3);clr(4);clr(5);clr(6);
  77. }
  78. int main(){
  79. freopen("sequence.in","r",stdin);
  80. freopen("sequence.out","w",stdout);
  81. int qu;scanf("%d",&qu);
  82. while(qu--) solve();
  83. return 0;
  84. }

洛谷 P5470 - [NOI2019] 序列(反悔贪心)的更多相关文章

  1. luogu P5470 [NOI2019]序列 dp 贪心 费用流 模拟费用流

    LINK:序列 考虑前20分 容易想到爆搜. 考虑dp 容易设\(f_{i,j,k,l}\)表示前i个位置 选了j对 且此时A选择了k个 B选择了l个的最大值.期望得分28. code //#incl ...

  2. 洛谷 P1628 合并序列

    洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100 ...

  3. 【洛谷 P1667】 数列 (贪心)

    题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...

  4. 洛谷1417 烹调方案 dp 贪心

    洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...

  5. BZOJ 1500 洛谷2042维护序列题解

    BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的 ...

  6. 洛谷 P4272 - [CTSC2009]序列变换(堆)

    洛谷题面传送门 u1s1 在我完成这篇题解之前,全网总共两篇题解,一篇使用的平衡树,一篇使用的就是这篇题解讲解的这个做法,但特判掉了一个点,把特判去掉在 BZOJ 上会 WA 一个点. 两篇题解都异常 ...

  7. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  8. 洛谷P4437 排列 [HNOI/AHOI2018] 贪心

    正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...

  9. 【洛谷】【二分答案+贪心】P1316 丢瓶盖

    [题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...

随机推荐

  1. python常用功能

    1. 获取昨天日期 引入datetime模块 import datetime def getYesterday(): today = datetime.date.today() #返回当前本地日期 # ...

  2. 【二食堂】Alpha - 测试报告

    TextMarking Alpha阶段测试报告 前后端测试过程及结果 在Alpha阶段,测试工作紧跟后端开发进度,一下是我们所做的一些测试工作. 后端单元测试 测试代码可以在git仓库中查看,后端对所 ...

  3. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

  4. uni-app 安卓离线打包详细教程

    借鉴 uni-app官方给出的文章http://ask.dcloud.net.cn/article/508(虽说是04年的) 预备环境 AndroidStudio开发环境,要求安装Android4.0 ...

  5. 洛谷 P2221 [HAOI2012]高速公路

    链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...

  6. 学会python永不加班系列之操作excel

    python作为一种解释性语言,简单高效的模式逐渐火爆.同时存在多种扩展性. 永不加班系列 python正确操作excel 实验环境: 系统:win10 语言:python3.8 承载软件:pycha ...

  7. S 锁与 X 锁的爱恨情仇《死磕MySQL系列 四》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  8. 当src获取不到图片,onerror可指定一张默认的图片

    <img src="img/789.png" onerror="javascript:this.src='img/123.png';" alt=" ...

  9. cesium制作自己的骑行轨迹

    制作自己的骑行轨迹 马上国庆节了,计划骑车回家,突然想到把所有的骑行线路汇总一下,无奈码表和APP不支持这样的操作,出于职业病,在此操作一下. 我用的是黑鸟码表,可以导出fit运动轨迹,但是fit还需 ...

  10. sqlldr导入报错:field in data file exceeds maximum length

    检查报错日志提示:field in data file exceeds maximum length REMARK字段设置:varchar2(2000),报错的内容也没有超1000个字符 表中定义的字 ...