CF618F-Double Knapsack【结论】
正题
题目链接:https://www.luogu.com.cn/problem/CF618F
题目大意
给出大小为\(n\),值域为\([1,n]\)的两个可重集合\(A,B\)
需要你对它们各求出可重子集使得两个子集中的数字和相等
输出方案。
\(1\leq n\le 10^6\)
解题思路
这个值域范围就很提示性的往鸽笼原理方面考虑。
此题的结论就是一定有连续子序列的解。
先搞一个前缀和\(A,B\),假设\(A_n\leq B_n\)。
现在我们要求两个\(l,r\)满足
\]
\]
现在问题就变为了求两个相同的\(A_x-B_y\).
对于每个\(A_x\)(\(x\in[0,n]\)),求出一个最大的\(y\)使得\(B_y\leq A_x\)
那么显然有\(A_x-B_y\in[0,n-1]\),也就是\(A_x-B_y\)一共只有\(n\)种取值,而我们有\(n+1\)个,所以至少有两个相同的。
开两个桶记录一下出现位置就好了。
时间复杂度\(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 构造、抽屉原理
传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...
- CF618F Double Knapsack
题意简化 给定两个大小为 n 的集合A,B,要求在每个集合中选出一个子集,使得两个选出来的子集元素和相等 元素范围在 1~n ,n<=1e5 题目连接 题解 考虑前缀和 令A集合的前缀和为SA, ...
- 【CF618F】Double Knapsack(构造)
[CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...
- 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 618 F] Double Knapsack (抽屉原理)
题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...
- Codeforces.618F.Double Knapsack(构造 鸽巢原理)
题目链接 \(Description\) 给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内.你需要从这两个集合中各选一个非空子集,使它们的和相等.输出方案. \( ...
- 2018.09.27 codeforces618F. Double Knapsack(抽屉原理+构造)
传送门 思维题. 考虑维护两个数列的前缀和a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an和b1,b2,b3,...,bnb_1,b_2,b_ ...
- 618F Double Knapsack
传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...
- CodeForces - 618F Double Knapsack
Discription You are given two multisets A and B. Each multiset has exactly n integers each between 1 ...
- vector族函数
本文原创,转载请注明出处,本人Q1273314690 vector(mode = "logical", length = 0) as.vector(x, mode = " ...
随机推荐
- 教你IO流来便利电脑磁盘所有文件,把图片放到一个文件夹里(会发现什么不可告人的密码)
一.需求 我要把C盘下面的所有图片都拿出来,放到一个新文件夹中.今天小编一身正气,看看有没有什么意外发现!!学会看看自己的盘,悄悄的哦!!! 二.代码展示(运行时间可能有点长) import java ...
- 【RPC】远程接口调用实例 的几种方式比较
pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...
- C#:[StructLayout(LayoutKind.Sequential)]
参考网址: https://blog.csdn.net/hongkonglife/article/details/23422857 结构体是由若干成员组成的.布局有两种1.Sequential,顺序布 ...
- ORM 之 EF的使用(一)
早期对数据库进行操作 通过Ado.Net 操作数据库 需要操作sqlCommand/sqlConnection/adapter/datareader 如图 后来 基于面向对象的思想 出现了中间件ORM ...
- blog.mzywucai.club停站
考研,不经营了,两台服务器也关了:blog.mzywucai.club也关了,就让它沉了吧!以后做个更好的?
- SSM:Mybatis中引入通用mapper
如果你是SSM项目引入通用mapper记得要引入hibernate中的一个hibernate-jpa-2.1-api-1.0.0.Final.jar包(注意必须要Mybatis整合Spring噢,其实 ...
- 🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!
JVM内存分配及申请过程 当使用new关键字或者其他任何方式进行创建一个类的对象时,JVM虚拟机需要为该对象分配内存空间,而对象的大小在类加载完成后已经确定了,所以分配内存只需要在Java堆中划分出一 ...
- Python中的变量以及变量的命名
1.变量的定义 在 python 中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建 等号(=)用来给变量赋值 =左边是一个变量名 =右边是存储在变量中的值 变量名=值 变量定义之后,后续就 ...
- openresty lua_ssl_trusted_certificate 问题
lua_ssl_trusted_certificate 语法: lua_ssl_trusted_certificate 默认: no 环境: http, server, location 指定一个 P ...
- 20210501 序列,熟练剖分(tree),建造游乐园(play)
考场 \(65+5+0\),并列 rk2 最高分 \(55+10+10\) T1:等比数列可以写作 \(q^kx\),发现 \(q\le1000\) 且有一档分为 \(a_i\le100\),想到 \ ...