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 ...
随机推荐
- WinHex数据恢复笔记(二)
续写上次笔记: 1.Winhex数据恢复软件的界面上的所有功能已经介绍了一遍,最主要的还是编程恢复的能力. 今天主要看看记事本的编辑恢复及其相关的一些问题,记事本的 编辑值是ASCII值,所以没有文件 ...
- pyhon----函数和方法的关系
1.如果使用类名调用,为函数,需要手动传self 2.如果使用对象调用,为方法,不用手动传self class Foo(object): def __init__(self): self.name=& ...
- AI-解析器-request.data内部如何按照自定义解析格式-解析数据
QUESTION:post方法中调用request.data方法时,当在Courseview类中添加parser_classes=[ForParser,],就可以将数据解析成parser_classe ...
- spring cloud 自定义ribbon客户端
一.自定义Ribbon客户端-[方式一]配置类 1.1.自定义负载规则 增加RibbonConfiguration.java配置类 public class RibbonConfiguration { ...
- map reduce程序示例
map reduce程序示例 package test2; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop. ...
- sqoop的基本语法详解及可能遇到的错误
1 sqoop介绍 Apache Sqoop是专为Apache Hadoop和结构化数据存储如关系数据库之间的数据转换工具的有效工具.你可以使用Sqoop从外部结构化数据存储的数据导入到Hadoop分 ...
- Linux下Nginx安装/启动/重启/停止
Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多.下面是下载地址 http://nginx.org/en/download.h ...
- Ubuntu 16.04 卸载Postgresql
首先确保postgresql是否在运行,在命令窗口输入 netstat -nlt han@han-OptiPlex-:~/project/0_ng_practice/ng-test$ netstat ...
- python之logging
1.简单使用 # CRITICAL, ERROR, WARNING, INFO, DEBUG) cewid import logging logging.basicConfig(level=loggi ...
- [转]搭建Hadoop伪分布式环境
https://my.oschina.net/MyHeaven1987/blog/1821509 http://hadoop.apache.org/docs/current/hadoop-projec ...