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 ...
随机推荐
- Raw Socket vs Stream Socket vs datagram socket,原始套接字与流式套接字与数据报套接字
https://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/ In this tutorial, lets take a look ...
- jQuery 实现添加表格行,删除行,调用日期控件
$(function () { getdatepicker(); getdatetimepicker(); }); $(document).on('click','#addTable',addTr); ...
- TCP/IP指纹鉴别 fingerprint
http://www.freebuf.com/articles/system/30037.html使用TCP/IP协议栈指纹进行远程操作系统辨识 Fyodor <fyodor@insecure. ...
- zabbix3.0对tcp连接数和状态的监控优化
zabbix3.0对tcp连接数及状态的监控优化 之前对tcp的监控采用netstat命令,发现在服务器繁忙的时候效果不理想,这个命令占用大量的cpu有时候高达90%以上,可能会导致业务的不稳定,所以 ...
- nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
nagios监控mysql主从同步 起因:nagios可能监控到mysql服务的运行情况,但确不能监控mysql的主从复制是否正常:有时候,同步已经停止,但管理人员却不知道. 登陆mysql从服务器, ...
- 选择一个 HTTP 状态码不再是一件难事 – Racksburg《转载》
本文转载自:众成翻译 译者:十年踪迹 链接:http://www.zcfy.cc/article/904 原文:http://racksburg.com/choosing-an-http-status ...
- LeetCode(38): 报数
Easy! 题目描述: 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 &qu ...
- hdu4190 二分答案
/*二分答案即可*/ #include<bits/stdc++.h> #define maxn 500005 #define ll long long #define INF 500000 ...
- python+selenium四:iframe查看、定位、切换
iframe是HTML里面嵌套HTML的一种框架 1.查看iframe 1.Top Window:可直接定位 2.iframe#i:说明此元素在iframe上 3.iframe显示为空:(id或nam ...
- Chakra TypedArray代码实现笔记
ArrayBuffer.cpp阅读 对象继承关系 JavascriptArrayBuffer: ArrayBuffer: ArrayBufferBase: DynamicObject: Recycla ...