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 ...
随机推荐
- jvm系列三、java GC算法 垃圾收集器
原文链接:http://www.cnblogs.com/ityouknow/p/5614961.html 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 ...
- centos6.5 nfs实时共享
一.什么时NFS NFS(Network File System)——网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,NF ...
- oracle 回退表空间清理
1.查看已有表空间,找到回退表空间 SELECT * FROM DBA_TABLESPACES WHERE CONTENTS='UNDO' 2.创建新的回退表空间 create undo tables ...
- centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解
centos6.5环境下Zookeeper-3.4.6集群环境部署 [系统]Centos 6.5 集群部署 [软件]准备好jdk环境,此次我们的环境是open_jdk1.8.0_101 zookeep ...
- http响应头设置
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...
- bootstrap----屏幕大小切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MVC中页面的传值方式总结
MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...
- WebApi的调用-2.后台调用
httpClient调用方式 namespace SOA.Common { //httpClient调用WebApi public class HttpClientHelper { public st ...
- poj 1751 输出MST中新加入的边
给出结点的坐标 以及已建好的边 要输出MST中加入的边(已建好的边就不用输出了)结点的编号从1开始注意这题只有一组数据 不能用多组输入 否则就超时(在这被坑惨了Orz) Sample Input 91 ...
- HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)
Sample Input14abab Sample Output6输出包括从1到len长 字符串前缀的总个数abab:包括2个a,2个ab,1个aba,1个abab # include <cst ...