洛谷题面传送门

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

考虑反悔贪心,首先我们考虑取出 \(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 简单,虽然我都不会做

const int MAXN=2e5;
int n,k,l,a[MAXN+5],b[MAXN+5],st[MAXN+5];
pii ap[MAXN+5],bp[MAXN+5];
priority_queue<pii> q1,q2,q3,q4,q5,q6;
/*
q1: maximum a[i] with st[i]=2
q2: maximum b[i] with st[i]=1
q3: maximum -a[i] with st[i]=1
q4: maximum -b[i] with st[i]=2
q5: maximum a[i]+b[i] with st[i]=0
q6: maximum -a[i]-b[i] with st[i]=3
*/
void solve(){
scanf("%d%d%d",&n,&k,&l);memset(st,0,sizeof(st));
for(int i=1;i<=n;i++) scanf("%d",&a[i]),ap[i]=mp(a[i],i);
for(int i=1;i<=n;i++) scanf("%d",&b[i]),bp[i]=mp(b[i],i);
sort(ap+1,ap+n+1);reverse(ap+1,ap+n+1);
sort(bp+1,bp+n+1);reverse(bp+1,bp+n+1);ll ans=0;
for(int i=1;i<=k;i++) st[ap[i].se]|=1,ans+=ap[i].fi;
for(int i=1;i<=k;i++) st[bp[i].se]|=2,ans+=bp[i].fi;
for(int i=1;i<=n;i++) l-=(st[i]==3);chkmax(l,0);
q1.push(mp(-2e9,0));q2.push(mp(-2e9,0));q3.push(mp(-2e9,0));
q4.push(mp(-2e9,0));q5.push(mp(-2e9,0));q6.push(mp(-2e9,0));
for(int i=1;i<=n;i++){
if(st[i]==2){
q1.push(mp(a[i],i));
q4.push(mp(-b[i],i));
} if(st[i]==1){
q2.push(mp(b[i],i));
q3.push(mp(-a[i],i));
} if(!st[i]){
q5.push(mp(a[i]+b[i],i));
} if(st[i]==3){
q6.push(mp(-a[i]-b[i],i));
}
}
while(l--){
#define qpop(a,b)\
while(!q##a.empty()){\
int x=q##a.top().se;\
if(!x||st[x]==b) break;\
q##a.pop();\
}
qpop(1,2);qpop(2,1);qpop(3,1);
qpop(4,2);qpop(5,0);qpop(6,3);
ll res1=0ll+q1.top().fi+q3.top().fi;
ll res2=0ll+q2.top().fi+q4.top().fi;
ll res3=0ll+q3.top().fi+q4.top().fi+q5.top().fi;
ll res4=0ll+q1.top().fi+q2.top().fi+q6.top().fi;
ll mx=max(max(res1,res2),max(res3,res4));ans+=mx;
if(res1==mx){
int x=q1.top().se,y=q3.top().se;
q1.pop();q3.pop();st[x]=3;st[y]=0;
q5.push(mp(a[y]+b[y],y));
q6.push(mp(-a[x]-b[x],x));
} else if(res2==mx){
int x=q2.top().se,y=q4.top().se;
q2.pop();q4.pop();st[x]=3;st[y]=0;
q5.push(mp(a[y]+b[y],y));
q6.push(mp(-a[x]-b[x],x));
} else if(res3==mx){
int x=q3.top().se,y=q4.top().se,z=q5.top().se;
q3.pop();q4.pop();q5.pop();st[x]=st[y]=0;st[z]=3;
q5.push(mp(a[x]+b[x],x));
q5.push(mp(a[y]+b[y],y));
q6.push(mp(-a[z]-b[z],z));
} else{
int x=q1.top().se,y=q2.top().se,z=q6.top().se;
q1.pop();q2.pop();q6.pop();st[x]=st[y]=3;st[z]=0;
q6.push(mp(-a[x]-b[x],x));
q6.push(mp(-a[y]-b[y],y));
q5.push(mp(a[z]+b[z],z));
}
} printf("%lld\n",ans);
#define clr(x) while(!q##x.empty()) q##x.pop();
clr(1);clr(2);clr(3);clr(4);clr(5);clr(6);
}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
int qu;scanf("%d",&qu);
while(qu--) solve();
return 0;
}

洛谷 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版学习笔记】图——拓扑排序 Topological Sort

    概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...

  2. [no code][scrum meeting] Beta 12

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月27日11:30,主持者:乔玺华 一.工作汇报 人员 昨日完成任务 明日要完成的任务 乔玺华 ...

  3. CCD摄像头视场角计算公式

    视场角大小和CCD传感器尺寸和镜头焦距有关: 水平视场角 = 2 × arctan(w / 2f); 垂直视场角 = 2 × arctan(h / 2f); 视场角 = 2 × arctan(d / ...

  4. MyBatis源码分析(五):MyBatis Cache分析

    一.Mybatis缓存介绍 在Mybatis中,它提供了一级缓存和二级缓存,默认的情况下只开启一级缓存,所以默认情况下是开启了缓存的,除非明确指定不开缓存功能.使用缓存的目的就是把数据保存在内存中,是 ...

  5. 替换空格 牛客网 剑指Offer

    替换空格 牛客网 剑指Offer 题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20A ...

  6. LOTO实践【干货】电压比较器的快速应用

    LOTO实践[干货]电压比较器的快速应用 话不多说先上图: 最近出差去客户那边做设备调试,现场如上图,其中我负责的技术部分包含了一个掉落物监测的功能.硬件上的原理比较简单,发射板上的红外发射头阵列,以 ...

  7. Pod 健康检查和服务可用性检查

    Kubernetes 对 Pod 的健康状态可以通过两类探针来检查:LivenessProbe 和 ReadinessProbe,kubelet 定期执行这两类探针来针对容器的健康状况. Livene ...

  8. QuantumTunnel:协议路由 vs 端口路由

    本篇来聊一下内网穿透中流量转发的问题 内网穿透和核心逻辑是根据流量的路由信息准确地将公网流量路由到指定的机器端口上,从而完成一次流量的内网穿透. 这里有一个核心问题,路由信息从哪里获取? 常见的有将路 ...

  9. Qt 项目管理文件(.pro) 详解

    项目文件目录树 在 Qt Creator 中新建一个 Widget Application 项目 samp2_1,在选择窗口基类的页面选择 QWidget 作为窗体基类,并选中"Genera ...

  10. 【Jenkins】jenkins构建python项目提示:'python' 不是内部或外部命令,也不是可运行的程序或批处理文件

    一.问题:jenkins构建python项目提示:'python' 不是内部或外部命令,也不是可运行的程序或批处理文件 二.原因:要在jenkins配置本地环境变量 三.解决方案:添加python.e ...