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_3,...,b_nb1,b2,b3,...,bn。不妨设an≤bna_n\le b_nan≤bn。
由于两个数列每个数都在1~n之间,所以说对于每一个aia_iai总能找到一个比aia_iai小且最接近的bjb_jbj,使得0≤ai−bj≤n−10\le a_i-b_j\le n-10≤ai−bj≤n−1,然后由于算上a0a_0a0一共有n+1n+1n+1对这样的(ai,bj)(a_i,b_j)(ai,bj),这样的话根据抽屉原理一定会有两对的差量是相同的,不妨设(ai,bj)(a_i,b_j)(ai,bj)与(ai′,bj′)(a_i',b_j')(ai′,bj′)的差量是相同的,那么说明ai−ai′=bj−bj′a_i-a_i'=b_j-b_j'ai−ai′=bj−bj′,于是我们就成功找到了一个可行解。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,a[N],b[N];
ll s1,s2,S1=0,S2=0;
map<int,pair<int,int> >mp;
inline void print(int l,int r){
printf("%d\n",r-l);
for(int i=l+1;i<=r;++i)printf("%d ",i);
puts("");
}
inline void solve(int a[],int b[],bool f){
s1=0,s2=0,mp[0]=make_pair(0,0);
for(int i=1,j=0;i<=n;++i){
s1+=a[i];
while(j<n&&s2+b[j+1]<=s1)s2+=b[++j];
int delta=s1-s2;
if(mp.count(delta)){
if(!f)print(mp[delta].first,i),print(mp[delta].second,j);
else print(mp[delta].second,j),print(mp[delta].first,i);
return;
}
mp[delta]=make_pair(i,j);
}
}
int main(){
n=read();
for(int i=1;i<=n;++i)S1+=(a[i]=read());
for(int i=1;i<=n;++i)S2+=(b[i]=read());
if(s1<s2)solve(a,b,0);
else solve(b,a,1);
return 0;
}
2018.09.27 codeforces618F. Double Knapsack(抽屉原理+构造)的更多相关文章
- [codeforces 618 F] Double Knapsack (抽屉原理)
题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...
- 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)
传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...
- 2018.09.27 bzoj3029: 守卫者的挑战(概率dp)
传送门 概率dp经典题目. 直接f[i][j][k]f[i][j][k]f[i][j][k]表示当前是第i次挑战,已经胜利了j次,目前的背包剩余空间是k. 然后用前面的转移后面的就行了. 注意第三维可 ...
- 2018.09.27 codeforces1045D. Interstellar battle(期望dp)
传送门 一道有意思的期望dp. 题意是给出一棵树,每个点最开始都有一个gg的概率,有m次修改,每次修改会把某个点gg的概率更换掉,让你求出每次修改之后整个树被分成的连通块的数量的期望(gg掉的点不算) ...
- 2018.09.27 hdu5564Clarke and digits(数位dp+矩阵快速幂)
传送门 好题啊. 我只会写l,rl,rl,r都很小的情况(然而题上并没有这种数据范围). 但这个dp转移式子可以借鉴. 我们用f[i][j][k]f[i][j][k]f[i][j][k]表示当前在第i ...
- 2018.09.27 bzoj2118: 墨墨的等式(最短路+背包)
传送门 好题啊. 首先找到最小的一个非零系数记做a1a_1a1,然后如果WWW modmodmod a1=W′a_1=W'a1=W′ modmodmod a1a_1a1,且WWW是方程的一个可行 ...
- 2018.09.27 bzoj4300: 绝世好题(二进制dp)
传送门 简单dp. 根据题目的描述. 如果数列bn{b_n}bn合法. 那么有:bi−1b_{i-1}bi−1&bi!=0b_i!=0bi!=0,因此我们用f[i]f[i]f[i]表示数 ...
- 2018.09.27 hdu4507吉哥系列故事——恨7不成妻(数位dp)
传送门 一道比较综合的数位dp. 维护三个值:[L,R][L,R][L,R] 区间中与7无关的数的数量,与7无关的数之和,与7无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
- 2018.09.27 网络协议(tarjan)
描述 一些学校连接在一个计算机网络上.学校之间存在软件支援协议.每个学校都有它应支援的学校名单(学校 a 支援学校 b ,并不表示学校 b 一定支援学校 a ).当某校获得一个新软件时,无论是直接得到 ...
随机推荐
- 8. mybatis实战教程(mybatis in action)之七:实现mybatis分页(源码下载)
转自:https://blog.csdn.net/tangruyi1992/article/details/52584012 上 一篇文章里已经讲到了mybatis与spring MVC的集成,并且做 ...
- 机器学习入门-K-means算法
无监督问题,我们手里没有标签 聚类:相似的东西聚在一起 难点:如何进行调参 K-means算法 需要制定k值,用来获得到底有几个簇,即几种类型 质心:均值,即向量各维取平均值 距离的度量: 欧式距离和 ...
- vue深入了解组件——插槽
一.插槽内容 Vue实现了一套内容分发的API,这套API基于当前的Web Components规范草案,将 <slot> 元素作为承载分发的内容的出口. 它允许你像这样合成组件: &l ...
- 在eclipse中修改生成的注释类、方法的作者、时间
1.打开eclipse:windos-->preferences-->Java-->Code Style -->Code Templates-->Types-->点 ...
- 通过sizeof获得数组长度的方法
int a[20]; int len = sizeof(a)/sizeof(*a); //值为20,即数组长度为20 注:sizeof是一个操作符,sizeof的值在编译时确定
- ubuntu 安装MySQLdb
ubuntu运行sudo pip install MySQL-python安装MySQLdb时报错:Command "python setup.py egg_info" faile ...
- 在JSP中,使用get提交方式出现乱码时,为什么要使用new String(s.getBytes("iso-8859-1"),"utf-8");?
最近在学JSP,在学习处理get方式提交数据出现乱码问题的时候,对其中的一个解决方法new String(s.getBytes("iso-8859-1"),"utf-8& ...
- MySql PartionBy
SELECT tableOld.*, if(@channelName = tableOld.channelName, @rank := @rank + 1, @rank := 1) AS rank, ...
- JS中数组的创建方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 大型运输行业实战_day02_2_数据模型建立
1.模型分析 1.基本必备字段 id state type createTime updateTime 2.车票 : 车次 开始车站 到达车站 出发时间 票价 ...