BZOJ4124 : [Baltic2015]Tug of war
建立二分图,首先如果存在度数为$0$的点,那么显然无解。
如果存在度数为$1$的点,那么这个点的匹配方案固定,可以通过拓扑排序去掉所有这种点。
那么现在剩下的点度数都至少为$2$,因为左右点数相等,且左边每个点度数都是$2$,所以右边只能是每个点的度数都是$2$。
在这种情况下每个连通块是一个环,相邻两条边不能同时选,一共有两种情况$x$和$y$。
假设$x\leq y$,那么把$x$加入$sum$,$y-x$既可以加入,又可以不加入,对$y-x$进行01背包即可。
注意到本题中物品数不超过$2n$,物品价值之和不超过$2k\leq 40n$。
所以将01背包转化为多重背包后只有$O(\sqrt{k})$种物品,二进制拆分+bitset优化即可。
时间复杂度$O(\frac{k\sqrt{k}\log k}{64})$。
#include<cstdio>
#include<bitset>
#include<algorithm>
using namespace std;
const int N=120010,M=1200010;
int n,m,K,i,j,k,x,y,z,g[N],v[N<<1],w[N<<1],nxt[N<<1],ed,d[N],h,t,q[N],vis[N],sum,cnt[M];
bitset<M>f;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y,int z){
d[x]++,d[y]++;
v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;
v[++ed]=x;w[ed]=z;nxt[ed]=g[y];g[y]=ed;
}
inline int go(int x){
for(int i=g[x];i;i=nxt[i])if(!vis[v[i]])return v[i];
return 0;
}
inline int get(int x,int y){for(int i=g[x];i;i=nxt[i])if(v[i]==y)return w[i];}
int main(){
read(n),read(K);m=n+n;
for(i=1;i<=m;i++){
read(x),read(y),read(z);
add(i,x+m,z);
add(i,y+n+m,-z);
}
m<<=1;
for(i=1;i<=m;i++)if(!d[i])return puts("NO"),0;
for(h=i=1;i<=m;i++)if(d[i]==1)q[++t]=i;
while(h<=t){
for(i=g[x=q[h++]];i;i=nxt[i])if(!vis[v[i]]){
y=v[i];
sum+=w[i];
break;
}
vis[x]=vis[y]=1;
for(i=g[y];i;i=nxt[i])if(!vis[x=v[i]]){
if(!(--d[x]))return puts("NO"),0;
if(d[x]==1)q[++t]=x;
}
}
for(n=0,i=1;i<=m;i++)if(!vis[i]){
vis[q[t=1]=i]=1;
for(j=go(i);j;j=go(j))vis[q[++t]=j]=1;
q[t+1]=q[1];
x=y=0;
for(j=1;j<=t;j+=2)x+=get(q[j],q[j+1]);
for(j=2;j<=t;j+=2)y+=get(q[j],q[j+1]);
if(x>y)swap(x,y);
sum+=x;
cnt[y-x]++;
n=max(n,y-x);
}
for(f[0]=i=1;i<=n;i++)for(j=1;cnt[i];j<<=1){
k=min(cnt[i],j);
cnt[i]-=k;
f|=f<<(i*k);
}
for(i=-K;i<=K;i++)if(i-sum>=0&&i-sum<M)if(f[i-sum])return puts("YES"),0;
return puts("NO"),0;
}
BZOJ4124 : [Baltic2015]Tug of war的更多相关文章
- HDU-2576 Tug of War
http://poj.org/problem?id=2576 二维数组01背包的变形. Tug of War Time Limit: 3000MS Memory Limit: 65536K Tot ...
- 随机算法 poj 2576 Tug of War
Tug of War Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8187 Accepted: 2204 Descri ...
- UVA - 10032 Tug of War (二进制标记+01背包)
Description Problem F: Tug of War A tug of war is to be arranged at the local office picnic. For the ...
- uva 10032 Problem F: Tug of War
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- zoj 1880 - Tug of War
题目:有n个人分成两组,两组人数差不能超过1,找到两组的人重量之差的最小值. 分析:dp,二维01背包. 由于必须放在两个组中的一组,直接背包全部可到状态, 取出相差不超过 1的最接近 sum/2的值 ...
- POJ2576 Tug of War 二维背包
题目大意 一群人拔河,给出每个人的重量,要求两队人数之差不超过1人,且每队总重量之差最小. 思路 选出严格总人数一半(或+1)的人为一队,在该队重量不超过所有人总重量一半的情况下,使其重量最大. 人数 ...
- poj 2576 Tug of War
还是神奇的随机算法,,(看视频说这是爬山法??) 其实就是把序列随机分成两半(我太弱,只知道random_shuffle),然后再每个序列里rand一个位置,x,y然后比较是不是交换之后是更优的. 然 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 动态规划:POJ2576-Tug of War(二维费用的背包问题)
Tug of War Time Limit: 3000MS Memory Limit: 65536K Description A tug of war is to be arranged at the ...
随机推荐
- 使用命令行登陆数据库配置文件修改 解决ora12528
下面是问题解决: ORA-12528: TNS:listener: all appropriate instances are blocking new connections 1:修改listene ...
- KVM -> 虚拟机磁盘管理_03
1.KVM磁盘管理 1.KVM qcow2.raw.vmdk等镜像格式说明:http://blog.csdn.net/zhengmx100/article/details/53887162 raw: ...
- html的结构-厂子型的布局
上图所示的布局设计是很常见的.这个该怎么做呢? 技术需求:header 要固定住在顶部,不随鼠标滚动而向上移动:左边的div的有一定的宽度,但是要贴浏览器的底部(屏幕顶部):右边的dv要占据右边的全屏 ...
- 各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异
标准参考 OBJECT 元素定义了一个嵌入的对象.其引入的初衷是取代 IMG 和 APPLET 元素.不过由于安全等各方面原因以及缺乏浏览器支持,这一初衷并未实现.浏览器的对象支持依赖于对象类型.然而 ...
- Fiddler模拟post四种请求数据
前言: Fiddler是一个简单的http协议调试代理工具,它界面友好,易于操作,是模拟http请求的利器之一. 在接口测试中,接口通常是get请求或者post请求.get请求的测试一般较为简单,只需 ...
- web----WSGI
概念: WSGI协议其实是定义了一种server与application解耦的规范 WSGI规范简单理解:一方面给Server提供接口,凡是以这种接口的web服务器,都是遵循WSGI规范的 另一方面给 ...
- 完全背包记录路径poj1787 好题
这题有点多重背包的感觉,但还是用完全背包解决,dp[j]表示凑到j元钱时的最大硬币数,pre[j]是前驱,used[j]是凑到j时第i种硬币的用量 △回溯答案时i-pre[i]就是硬币价值 #incl ...
- PyCharm Professional破解版和汉化下载地址-new
2018.1版本下载地址 2018.2.1版本下载地址 今天找了很久很多都不能用了,注意破解过程提到的小细节,如果破解完了点击没反应请检查"pycharm.exe.vmoptions&quo ...
- python + selenium 模块封装及参数化
模块封装 示例代码: baidu.py from time import sleep from selenium import webdriver driver = webdriver.Chrome( ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...