CF618F Double Knapsack
Double Knapsack
题面翻译
给你两个可重集
题目描述
You are given two multisets
You would like to find a nonempty subset of
If no solution exists, print
输入格式
The first line of the input contains a single integer
The second line contains
The third line contains
输出格式
If there is no solution, print a single integer
The first line should contain a single integer
The third line should contain a single integer
Elements in both sets are numbered from
样例 #1
样例输入 #1
10
10 10 10 10 10 10 10 10 10 10
10 9 8 7 6 5 4 3 2 1
样例输出 #1
1
2
3
5 8 10
样例 #2
样例输入 #2
5
4 4 3 3 3
2 2 2 2 5
样例输出 #2
2
2 3
2
3 5
Solution
一道思维题,需要有比较强的想象力才可能想到正解。
我们先假设这个问题一定存在一组符合题意的解,而且这组解在两个序列中还是连续的。定义
移项得:
因为
移项得:
这不就裸的前缀和式子?因此可以证明一定存在答案,并且答案一定是在两个序列中连续的一段子序列。
考虑如何求出
Code
需要注意因为序列中的数字值域是 long long
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof a)
//#define int long long
using namespace std;
template<typename T> void read(T &k)
{
k=0;T flag=1;char b=getchar();
while (!isdigit(b)) {flag=(b=='-')?-1:1;b=getchar();}
while (isdigit(b)) {k=k*10+b-48;b=getchar();}
k*=flag;
}
template<typename T> void write(T k) {if (k<0) {putchar('-'),write(-k);return;}if (k>9) write(k/10);putchar(k%10+48);}
template<typename T> void writewith(T k,char c) {write(k);putchar(c);}
const int _SIZE=1e6;
int n,a[_SIZE+5],b[_SIZE+5];
long long suma[_SIZE+5],sumb[_SIZE+5],id[_SIZE+5][2];
bool flag[_SIZE+5];
signed main()
{
read(n);
for (int i=1;i<=n;i++) read(a[i]),suma[i]=suma[i-1]+a[i];
for (int i=1;i<=n;i++) read(b[i]),sumb[i]=sumb[i-1]+b[i];
bool swaped=0;
if (suma[n]>sumb[n]) swaped=1,swap(suma,sumb);
int j=0,al,ar,bl,br;
for (int i=0;i<=n;i++)
{
while (suma[i]>=sumb[j] && j<=n) j++;j--;
if (flag[suma[i]-sumb[j]])
{
al=id[suma[i]-sumb[j]][0]+1;ar=i;
bl=id[suma[i]-sumb[j]][1]+1;br=j;
break;
}
flag[suma[i]-sumb[j]]=1;
id[suma[i]-sumb[j]][0]=i;
id[suma[i]-sumb[j]][1]=j;
}
if (swaped) swap(al,bl),swap(ar,br);
writewith(ar-al+1,'\n');
for (int i=al;i<=ar;i++) writewith(i,' ');puts("");
writewith(br-bl+1,'\n');
for (int i=bl;i<=br;i++) writewith(i,' ');puts("");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步