Codeforces.618F.Double Knapsack(构造 鸽巢原理)
\(Description\)
给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内。你需要从这两个集合中各选一个非空子集,使它们的和相等。输出方案。
\(n\leq10^6\)。
\(Solution\)
求子集是假的...对两个集合按任意顺序求个前缀和,记为\(SA_i,SB_i\)。不妨假设\(SA_n\leq SB_n\)。
那么能发现,对于每个\(SA_i\ (0\leq i\leq n)\),找出最大的\(SB_j\leq SA_i\)的\(j\),\(SA_i-SB_j\)的取值范围是\([0,n-1]\)(如果\(\geq n\)则可以移动\(j\)),只有\(n\)种。而\(i\)的取值有\(n+1\)种。由鸽巢原理,那么一定存在一对\(i,i'\ (i\neq i')\),使得\(SA_i-SB_j=SA_{i'}-SB_{j'}\)。因为元素大于\(0\),所以\(j\neq j'\)。
那么有\(SA_i-SA_{i'}=SB_j-SB_{j'}\),就可以得到答案啦。
//421ms 23800KB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+5;
LL sa[N],sb[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
void Solve(const int n,LL *sa,LL *sb,int &la,int &ra,int &lb,int &rb)
{
static int vis[N],vis2[N];
sb[n+1]=1ll<<60;
memset(vis,0xff,sizeof vis);
for(int i=0,j=0,v; i<=n; ++i)
{
while(sb[j+1]<=sa[i]) ++j;
if(~vis[v=sa[i]-sb[j]]) {la=vis[v], ra=i, lb=vis2[v], rb=j; break;}
vis[v]=i, vis2[v]=j;
}
}
int main()
{
int n=read();
for(int i=1; i<=n; ++i) sa[i]=sa[i-1]+read();
for(int i=1; i<=n; ++i) sb[i]=sb[i-1]+read();
int la,ra,lb,rb;
if(sa[n]>sb[n]) Solve(n,sb,sa,lb,rb,la,ra);
else Solve(n,sa,sb,la,ra,lb,rb);
printf("%d\n",ra-la);
for(int i=la+1; i<=ra; ++i) printf("%d ",i); putchar('\n');
printf("%d\n",rb-lb);
for(int i=lb+1; i<=rb; ++i) printf("%d ",i); putchar('\n');
return 0;
}
Codeforces.618F.Double Knapsack(构造 鸽巢原理)的更多相关文章
- codeforces 851C Five Dimensional Points(鸽巢原理)
http://codeforces.com/contest/851/problem/C 题意 - 给出 n 个五维空间的点 - 一个点a为 bad 的定义为 存在两点 b, c, 使的<ab, ...
- CF618F Double Knapsack 构造、抽屉原理
传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...
- CodeForces - 618F Double Knapsack
Discription You are given two multisets A and B. Each multiset has exactly n integers each between 1 ...
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) F. Double Knapsack 鸽巢原理 构造
F. Double Knapsack 题目连接: http://www.codeforces.com/contest/618/problem/F Description You are given t ...
- Codeforces 1188C DP 鸽巢原理
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少? 思路:(官方题解)我们先解决这个问题的子问题:我们可以求出bea ...
- Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value(鸽巢原理)
题目链接:https://codeforces.com/problemset/problem/1365/E 题意 有 $n$ 个元素,定义大小为 $k$ 的集合值为 $\sum2^i$,其中,若集合内 ...
- CodeForces 125D【鸽巢原理】
哇塞?开始的三个数其中两个数一定能确定一个序列.(鸽巢原理) #include <bits/stdc++.h> using namespace std; typedef long long ...
- [BZOJ4722]由乃[鸽巢原理+bitset+倍增]
题意 给定长为 \(n\) 序列 \(a\) ,要求支持两种操作: \(1.\) 询问在一个区间 \([l,r]\) 中,是否能够选出两个交集为空的集合 $ \rm X ,Y$, 使得 \(\sum_ ...
- POJ2356 Find a multiple 抽屉原理(鸽巢原理)
题意:给你N个数,从中取出任意个数的数 使得他们的和 是 N的倍数: 在鸽巢原理的介绍里面,有例题介绍:设a1,a2,a3,……am是正整数的序列,试证明至少存在正数k和l,1<=k<=l ...
随机推荐
- laravel 容器注入的坑
今天遍历添加数据时遇到个坑,哪位大神知道什么原因?? 起初的代码是这样的:(部分) public function addActive(Request $request, Activenorms $a ...
- WireShark 实例分析笔记(概念)
1.嗅探器工作原理(中文版) 安装软件的附带WinPcap(实现从网卡接受数据可视化) 数据嗅探器工作原理, 第一:收集数据(数据包嗅探器从网络线缆上收集原始二进制数据,选定特定网卡设置混杂模式来完 ...
- java 多线程中的锁的类别及使用
目前在Java中存在两种锁机制: synchronized Lock Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea. 数据同步需要依赖锁,那锁的同步又依赖谁? ...
- 微信小程序--WXS---JS 代码插入
主页要使用的JS代码放在index.js里面 例 Page({ data: { array: [1, 2, 3, 4, 5, 1, 2, 3, 4] } }) 只复制以下这段 data: { arra ...
- python指定分隔符来分割文件
1 import re 2 p = re.compile('AAAAAAAA',re.S) 3 f = open(r"D:\test\oldfile.txt","r&qu ...
- Senparc.Weixin微信开发(3) 自定义菜单与获取用户组
自定义菜单 代码参考:http://www.cnblogs.com/szw/p/3750517.html 还可以使用他们官网的自定义:https://neuchar.senparc.com/User/ ...
- Linux使用退格键时出现^H ^?解决方法
Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...
- android开发默认图标怎么换?
首先要在资源文件放入想换的图标图片拖到drawable-XX文件夹下, 然后打开AndroidManifest.xml这个配置清单文件找 到application标签里的这句android:icon= ...
- java线程间的通信方式
1.同步 synchronized 2.轮询 while volatile 3.wait/notify机制 syncrhoized加锁的线程的Object类的wait()/notify()/not ...
- jquery轻量级数字动画插件jquery.countup.js
插件描述: jquery.countup.js 是一款轻量级jquery数字动画插件.该数字动画插件可以在页面滚动时,将指定的数字从0开始计数增加动画. 插件说明 jquery.countup.js ...