CF618F-Double Knapsack【结论】
正题
题目链接:https://www.luogu.com.cn/problem/CF618F
题目大意
给出大小为nnn,值域为[1,n][1,n][1,n]的两个可重集合A,BA,BA,B
需要你对它们各求出可重子集使得两个子集中的数字和相等
输出方案。
1≤n≤1061\leq n\le 10^61≤n≤106
解题思路
这个值域范围就很提示性的往鸽笼原理方面考虑。
此题的结论就是一定有连续子序列的解。
先搞一个前缀和A,BA,BA,B,假设An≤BnA_n\leq B_nAn≤Bn。
现在我们要求两个l,rl,rl,r满足
Ar1−Al1=Br2−Bl2A_{r_1}-A_{l_1}=B_{r_2}-B_{l_2}Ar1−Al1=Br2−Bl2
⇒Ar1−Br2=Al1−Bl2\Rightarrow A_{r_1}-B_{r_2}=A_{l_1}-B_{l_2}⇒Ar1−Br2=Al1−Bl2
现在问题就变为了求两个相同的Ax−ByA_x-B_yAx−By.
对于每个AxA_xAx(x∈[0,n]x\in[0,n]x∈[0,n]),求出一个最大的yyy使得By≤AxB_y\leq A_xBy≤Ax
那么显然有Ax−By∈[0,n−1]A_x-B_y\in[0,n-1]Ax−By∈[0,n−1],也就是Ax−ByA_x-B_yAx−By一共只有nnn种取值,而我们有n+1n+1n+1个,所以至少有两个相同的。
开两个桶记录一下出现位置就好了。
时间复杂度O(n)O(n)O(n)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6+10;
ll n,a[N],b[N],la[N],lb[N];
signed main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]+=a[i-1];for(ll i=1;i<=n;i++)scanf("%lld",&b[i]),b[i]+=b[i-1];bool f=0;if(a[n]>b[n]){for(ll i=1;i<=n;i++)swap(a[i],b[i]);f=1;}ll ala,alb,ara,arb;for(ll i=0,j=0;i<=n;i++){while(b[j]<=a[i])j++;j--;if(la[a[i]-b[j]]){ala=la[a[i]-b[j]];alb=lb[a[i]-b[j]];ara=i;arb=j;}la[a[i]-b[j]]=i+1;lb[a[i]-b[j]]=j+1;}if(f)swap(ala,alb),swap(ara,arb);printf("%lld\n",ara-ala+1);for(ll i=ala;i<=ara;i++)printf("%lld ",i);printf("\n%lld\n",arb-alb+1);for(ll i=alb;i<=arb;i++)printf("%lld ",i);return 0;
}
CF618F-Double Knapsack【结论】相关推荐
- CF618F Double Knapsack 构造、抽屉原理
传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...
- C++ sizeof 使用规则及陷阱分析【转】
目录 一.什么是sizeof 二.sizeof用法 三.基本数据类型的sizeof 四.复杂数据类型的sizeof及其数据对齐问题 五.class类型的sizeof特别探讨 六.总结 一.什么是siz ...
- java long类型转string_JavaSE的学习——数据类型
数据类型分为基本数据类型和引用数据类型两大类 在下面数据类型的介绍中只会介绍8种基本数据类型和引用数据类型中的类类型中的一个类String 基本数据类型 1. 计算机中的存储单位 8bit = 1by ...
- java窗口弹出的位置_java的窗口弹出和动手动脑
窗口弹出 //两数相加窗口弹出 张雪晴 2015/10/3 import javax.swing.JOptionPane; public class Addition { public static ...
- 2016区域赛前冲刺训练
UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...
- 基本数据类型和它们之间的运算规则
基本数据类型 一.整型变量.(byte一个字节.char两字节.short两字节.int四字节) 1.输出超过范围的数据类型编译不通过. 例子:byte范围: -128 ~ 127 而 byte b2 ...
- 01背包问题分支限界java_分支限界法-01背包问题
1.分支限界法介绍 分支限界法类似于回溯法,也是在问题的解空间上搜索问题解的算法.一般情况下,分支限界法与回溯法的求解目标不同.回溯法的求解目标是找出解空间中满足约束条件的所有解:而分支限界法的求解目 ...
- Java 中的 NaN
概述 简单来说可以认为 NaN 是一个数字数据类型变量值,这个类型变量被定义为 这不是一个数字. 在这篇文章中,我们对 Java 中的 NaN 进行一些简单的描述和说明和在那些操作的过程中可以尝试这个 ...
- 0-1背包、部分背包和完全背包模板
一:0-1背包 当数据是实数时,乘个数使它变成整数.如3.22->3.22*100=322; 理解模板: #include<cstdio> #include<iostream& ...
- 3.3 数据成员的存取
本节的讨论针对两种情况的效率进行分析: class X {public://数据成员memstatic double mem; };X orgin; X * pt = &orgin;//考虑以 ...
最新文章
- 第十三届计算机语言学大会,第十三届全国语音学学术会议(PCC 2018) 会议通知第3号...
- 已解决:CentOS 7安装Docker Compose
- 新手入门机器学习十大算法
- jq fileupload 设置最大文件大小5m_我猜你并不会设置“分辨率”
- 【华为大咖分享】4.反脆弱,高效能组织的能力构建(后附PPT下载地址)
- java写龟兔赛跑_有关JAVA编写龟兔赛跑的游戏的问题。求助……
- ios下fixed回复框bug的解决方案
- 俺的房子内有空调冬暖夏凉,房间宽敞气派非凡
- Java7 和 C# 2.0
- 一篇文章搞定支付宝网页支付!
- 下次激活策略10_陈金凌:年流量1-10万独立站关键词策略案例(1)
- 望海潮·无处闻三年六月歌
- 数字通信系统中的频带利用率
- 【计算机视觉】Lecture 11:LoG和DoG滤波算子
- UDT(【CVPR2019】Unsupervised Deep Tracking无监督目标跟踪)
- c语言的所有头文件,C语言所有头文件.doc
- pdf转jpg在线转换免费
- 【优化控制】基于遗传算法实现优化LQR控制器含Matlab源码
- 2020年山东大学数字电路906真题
- 抓住机会,敢于尝试——第一次讲解ppt
热门文章
- jmeter聚个报告怎么看qps_Jmeter 使用笔记之 html 报告扩展(一)
- lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!
- Java将mysql输出csv_使用Java将大量数据从数据库导出到.csv时出...
- php 画图 坐标,说说PHP作图(一)_php
- html插入图片和文字,HTML第三课文字图片插入
- Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成
- 机器学习之格式变化——reshape(-1,1)
- 解决浏览器存储问题,不得不了解的cookie,localStorage和sessionStorage
- java numberformat异常_Java NumberFormat格式化float类型的bug
- [Spring5]IOC容器_Bean管理注解方式_完全注解开发