【CF618F】Double Knapsack(构造)
【CF618F】Double Knapsack(构造)
题面
题解
很妙的一道题。
发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等。
把区间和转为前缀和的形式,现在问题变成了,给定两个单增的数列\(A,B\),不妨令\(A_n<B_n\)找到\(l1,r1,l2,r2\),满足\(A_{r1}-A_{l1}=B_{r2}-B_{l2}\),换一下就是\(B_{l2}-A_{l1}=B_{r2}-A_{r1}\)。
那么对于\(A\)数列的每个\(i\le [0,n]\)我们都一定可以在\(B\)数量中找到一个最小的\(j\)使得\(0\le B_j-A_i<n\),证明就是因为每个元素都小于\(n\)。
那么这样子一共会产生\(n+1\)个差,根据鸽巢原理,必定有两个差相等,那么等价于我们构造出了一组答案。
这题最妙的地方就是在于本来限制相当宽松,我们强制加强了限制,反而能够更容易的得到解了。
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 1000100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX],b[MAX],fl;ll A[MAX],B[MAX];
void Output(int l1,int r1,int l2,int r2)
{
if(fl)swap(l1,l2),swap(r1,r2);
printf("%d\n",r1-l1);for(int i=l1+1;i<=r1;++i)printf("%d ",i);puts("");
printf("%d\n",r2-l2);for(int i=l2+1;i<=r2;++i)printf("%d ",i);puts("");
exit(0);
}
int main()
{
n=read();
for(int i=1;i<=n;++i)A[i]=A[i-1]+read();
for(int i=1;i<=n;++i)B[i]=B[i-1]+read();
if(A[n]>B[n])swap(A,B),fl=1;
for(int i=0;i<n;++i)a[i]=-1;
for(int i=0,j=0;i<=n;++i)
{
while(B[j]<A[i])++j;
int d=B[j]-A[i];
if(~a[d])Output(a[d],i,b[d],j);
a[d]=i;b[d]=j;
}
puts("-1");
return 0;
}
【CF618F】Double Knapsack(构造)的更多相关文章
- CF618F Double Knapsack 构造、抽屉原理
传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...
- Codeforces.618F.Double Knapsack(构造 鸽巢原理)
题目链接 \(Description\) 给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内.你需要从这两个集合中各选一个非空子集,使它们的和相等.输出方案. \( ...
- CF618F Double Knapsack
题意简化 给定两个大小为 n 的集合A,B,要求在每个集合中选出一个子集,使得两个选出来的子集元素和相等 元素范围在 1~n ,n<=1e5 题目连接 题解 考虑前缀和 令A集合的前缀和为SA, ...
- 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 ...
- 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_ ...
- CodeForces - 618F Double Knapsack
Discription You are given two multisets A and B. Each multiset has exactly n integers each between 1 ...
- 618F Double Knapsack
传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...
- [codeforces 618 F] Double Knapsack (抽屉原理)
题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...
- BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数
先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一 ...
随机推荐
- rest-framework的认证组件
认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. ...
- JMeter学习non-gui模式运行
-h, --help print usage information and exit #打印帮助信息 -v, --version print the version information and ...
- python3 打开页面后多窗口处理三种方法
多窗口处理三种方法 导包,实例化浏览器from selenium import webdriver fx=webdriver.Firefox()方法一fx.switch_to.window(fx.wi ...
- # 【Python3练习题 004】输入某年某月某日,判断这一天是这一年的第几天?
# [Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? # 思路:先判断是否为闰年,这关系到 2 月份的天数.# 之后再根据月份值把前几个月的天数累积加起来,最后再加上个“日 ...
- 关于idea easyui 引入css js
1.引用官方网站 <link rel="stylesheet" type="text/css" href="http://www.w3cscho ...
- static关键字的用法
静态变量和静态方法 static关键字的基本用法: 1.修饰变量:被static修饰的变量属于类变量,可以用类名.变量名来引用,而不用直接new一个对象来引用. 2.修饰方法:被static修饰的方法 ...
- 老男孩python学习自修第十九天【异常处理】
1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...
- Java对象clone()的测试
Object中自带native clone()方法. 研究了一下用法. public class DeepCopyTest { public static void main(String[] arg ...
- Java使用RabbitMQ之整合Spring(消费者)
依赖包: <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.am ...
- Lodop打印设计、维护、预览、直接打印简单介绍
四者的区别和联系:(其中PRINT_DESIGN打印设计是提供给开发人员的,另外三个可开放给用户)PRINT_DESIGN打印设计:辅助开发人员设计,图形化拖动插入修改等,设计完成后,生成代码拷贝到程 ...