正题

题目链接: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_{r_1}-A_{l_1}=B_{r_2}-B_{l_2}
\]
\[\Rightarrow A_{r_1}-B_{r_2}=A_{l_1}-B_{l_2}
\]

现在问题就变为了求两个相同的\(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【结论】的更多相关文章

  1. CF618F Double Knapsack 构造、抽屉原理

    传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...

  2. CF618F Double Knapsack

    题意简化 给定两个大小为 n 的集合A,B,要求在每个集合中选出一个子集,使得两个选出来的子集元素和相等 元素范围在 1~n ,n<=1e5 题目连接 题解 考虑前缀和 令A集合的前缀和为SA, ...

  3. 【CF618F】Double Knapsack(构造)

    [CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...

  4. 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 ...

  5. [codeforces 618 F] Double Knapsack (抽屉原理)

    题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...

  6. Codeforces.618F.Double Knapsack(构造 鸽巢原理)

    题目链接 \(Description\) 给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内.你需要从这两个集合中各选一个非空子集,使它们的和相等.输出方案. \( ...

  7. 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_ ...

  8. 618F Double Knapsack

    传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...

  9. CodeForces - 618F Double Knapsack

    Discription You are given two multisets A and B. Each multiset has exactly n integers each between 1 ...

  10. vector族函数

     本文原创,转载请注明出处,本人Q1273314690 vector(mode = "logical", length = 0) as.vector(x, mode = " ...

随机推荐

  1. c# button Command

    internal class DelegateCommand : ICommand { private readonly Action _execute; private readonly Func& ...

  2. JavaWeb之分页查询

    时间:2016-12-11 01:41 1.分页的优点:    只查询一页,不需要查询所有数据,能够提高效率.2.分页数据    页面的数据都是由Servlet传递的    *   当前页:pageC ...

  3. 理解Java中对象基础Object类

    一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...

  4. 一个简单的 aiax请求例子

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  5. JavaWeb_MVC 设计模式

    Servlet缺点:(1)用servlet进行显示(out)会很麻烦,因为servlet是一个类,托福ibt并不擅长做显示:(2)servlet直接访问数据表的话,servlet内的访问和操作数据表的 ...

  6. grpc服务发现与负载均衡

    前言 在后台服务开发中,高可用性是构建中核心且重要的一环.服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题.今天来谈一下我在实际中是如何理解及落 ...

  7. iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

    写在前面   在文章"嵌入式Linux的CAN总线配置--基于迅为iTOP-4412开发板"中我给4412开发板配置了SPI转CAN模块,使用的是不带设备树的内核.在本篇文章中,要 ...

  8. angularjs 文件上传

    github连接地址:https://github.com/danialfarid/ng-file-upload 核心代码: html: <div class="form-group& ...

  9. Elasticsearch-head插件的安装与配置

    第一种: 通过浏览器添加插件 通过chrome安装插件的方式提供一个可操作es的图形化界面. 在chrome 浏览器中,通过"扩展程序" 添加 elasticsearch head ...

  10. 迷宫3---BFS

    经过思考蒜头君终于解决了怎么计算一个迷宫的最短路问题,于是蒜头君找到一个新的迷宫图,来验证自己是否真的会计算一个迷宫的最短路. 为了检验自己计算的是否正确,蒜头君特邀你一起来计算. 输入格式 第一行输 ...