【JZOJ6231】【20190625】等你哈苏德
题目
有\(m\)条线段,每条线段为\([l_i,r_i]\),每条线段可以是黑/白色
有些线段已经被染色,有些需要被确定颜色
询问是否存在一种染色方案,使得对于每一个位置\(i\),覆盖它的线段黑白个数差的绝对值不超过1
\(1 \le m \le 10^5 , n \le 10^9\)
题解
将每条线段变成\([l_i-0.5,r_i+0.5]\)
对于一个合法的方案可以加一些线段使得黑白覆盖的个数相等
对\(l_i\)向\(r_i\)连一条边,如果把染色看成定向
合法的方案满足在相邻两个点的中间划分,正向割边数=反向隔边数
这相当于求一个欧拉回路(暂时不会证)
离散化,连边后找到度数为奇数的点补成偶数
注意由于一段的-1+1可能是交替的,所以只能对相邻的点补边
接着用网络流做混合图的欧拉回路
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=60010;
int n,m,cnt,tot,o,S,T,d[N],val[N],cur[N],dis[N],hd[N],id[N],sub[N],tt;
map<int,int>mp;
map<int,int>::iterator it;
struct edge{int u,v,w;}e[N];
struct Edge{int v,nt,f;}E[N<<2];
int get(int x){
int&t=mp[x];
if(t)return t;
val[t=++cnt]=x;
return t;
} void adde(int u,int v,int w){
E[o]=(Edge){v,hd[u],w};hd[u]=o++;
E[o]=(Edge){u,hd[v],0};hd[v]=o++;
} bool bfs(){
static int head,tail,q[N],vis[N];
for(int i=S;i<=T;++i)vis[i]=0,dis[i]=0;
head=tail=0;vis[q[++tail]=S]=1;
while(head<tail){
int u=q[++head];
for(int i=hd[u];~i;i=E[i].nt)if(E[i].f&&!vis[E[i].v]){
int v=E[i].v;
dis[v]=dis[u]+1;vis[v]=1;q[++tail]=v;
if(v==T)return true;
}
}
return false;
} int dfs(int u,int F){
if(u==T||!F)return F;
int flow=0,f;
for(int i=cur[u];~i;i=E[i].nt){
int v=E[cur[u]=i].v;
if(dis[v]==dis[u]+1 && (f=dfs(v,min(E[i].f,F)))){
flow+=f,F-=f;
E[i].f-=f,E[i^1].f+=f;
if(!F)break;
}
}
if(!flow)dis[u]=0;
return flow;
} int dinic(){
int flow=0;
while(bfs()){
for(int i=S;i<=T;++i)cur[i]=hd[i];
flow+=dfs(S,inf);
}
return flow;
} int main(){
freopen("wait.in","r",stdin);
freopen("wait.out","w",stdout);
scanf("%d%d",&m,&n);
for(int i=1,u,v,w;i<=m;++i){
scanf("%d%d%d",&u,&v,&w);v++;
sub[++tt]=u;sub[++tt]=v;
u=get(u),v=get(v);id[i]=-1;
if(w==1)d[v]++,d[u]--;
else d[u]++,d[v]--;
e[++tot]=(edge){u,v,w};
}
sort(sub+1,sub+tt+1);
for(int i=1;i<=tt;i+=2){
if(sub[i]==sub[i+1])continue;
int u=get(sub[i]),v=get(sub[i+1]);
d[u]++,d[v]--;
e[++tot]=(edge){u,v,-1};
id[tot]=-1;
}
/*int lst=0,now=0;
for(it=mp.begin();it!=mp.end();++it){
int i=(*it).second;
if(!(d[i]&1))continue;
if(!lst){lst=i;continue;}else now=i;
d[lst]++,d[now]--;
e[++tot]=(edge){lst,now,-1};
id[tot]=-1;lst=0;
}*/
S=0;T=cnt+1;for(int i=S;i<=T;++i)hd[i]=-1;
//cout<<S<<" "<<T<<endl;
int sum=0;
for(int i=1;i<=cnt;++i)if(d[i]>0)adde(S,i,d[i]/2),sum+=d[i]/2;else adde(i,T,-d[i]/2);
for(int i=1;i<=tot;++i)if(!~e[i].w){
e[i].w=0;id[i]=o;
adde(e[i].u,e[i].v,1);
}//
//cout<<o<<endl;
if(dinic()!=sum){puts("-1");return 0;}
for(int i=1;i<=tot;++i)if(~id[i]&&!E[id[i]].f)e[i].w^=1;
/*{
for(int i=1;i<=tot;++i)printf("%d %d %d\n",e[i].u,e[i].v,e[i].w);
}*/
for(int i=1;i<=m;++i)printf("%d ",e[i].w);
return 0;
}
【JZOJ6231】【20190625】等你哈苏德的更多相关文章
- 5.29 SD省队培训D1
5.29 SD省队培训D1 自闭的一天 T1 梦批糼 先咕一咕(两天之内一定补上) T2 等你哈苏德 继续咕(一星期之内补上) T3喜欢最最痛 四十分做法: 首先,我们发现同一个点加两条额外边是一件非 ...
- 尚德,国美 interview summary
尚德 Q:SDWebimage源代码,cell重用.先请求出来小头像,再请求出大头像?怎么处理? SDWebImageDownloader 直接给cell设置图片会怎样 A:图片URL相同,比较nsd ...
- 2015最新德淘W家(Windeln.de)新人优惠码wcode0520,赠1000积分,可抵10欧元
德淘W家(Windeln.de)网址:www.windeln.de 德淘W家(Windeln.de)的新人优惠码wcode0520 第一次购物结账时输入wcode0520,提交订单,1000积分划入你 ...
- 佛洛依德 c++ 最短路径算法
//20142880 唐炳辉 石家庄铁道大学 #include<iostream> #include<string> using namespace std; #define ...
- 是德科技完成对Anite的收购
是德科技公司(NYSE:KEYS)日前宣布已经完成对Anite 的收购行动.Anite 是业界领先的无线研发软件解决方案供应商.是德科技通过支付大约6 亿美元现金将其收入麾下,旨在支持是德科技发展无线 ...
- [原创.数据可视化系列之五]韩国"萨德"系统防御图
自从7月8日美国和韩国共同宣布将在韩国部署萨德反导系统后,韩国国内对此事的巨大争议以及本地区一些国家的强烈不满情绪在持续发酵.“萨德”(THAAD)全称“末段高空区域防御系统”,是美国导弹防御局和美国 ...
- 用JQ仿造礼德财富网的图片查看器
现在就职于一家P2P平台,自然也会关注同行其它网站的前端技术,今天要仿造的是礼德内页的一个图片查看器效果.不过说白了,无论人人贷也好礼德财富也好,很多地方的前端都做的不尽如人意,比如忽略细节.缺乏交互 ...
- 我所了解的各公司使用的 Ceph 存储集群 (携程、乐视、有云、宝德云、联通等)
Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解到的一些使用案例. ...
- hdu1071(抛物线弓形面积阿基米德算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...
随机推荐
- java中多重循环和break、continue语句
一.嵌套循环 循环可以互相嵌套,以实现更加复杂的逻辑,其代码的复杂程度也会提高,对初学者而言这应该是个难点,下面我们通过一些例子说明嵌套循环的使用,读者要自己把这些代码上机练习,并理解程序运行的流程. ...
- laravel hash密码生成和密码验证
在laravel中 登录表单中的密码是用hash来生成的. 在生成密码需要用到 laravel框架中的方法(都是laravel封装好了的) bcrypt($password)方法,直接将获取到的pas ...
- jQuery中使用Ajax获取JSON格式数据示例代码
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSONM文件中包含了关于“名称”和“值”的信息.有时候我们需要读取JSON格式的数据文件,在jQuery中 ...
- opencv简单卷积运用
import cv2 as cv import numpy as np img=cv.imread('learn.jpg',cv.IMREAD_GRAYSCALE) cv.imshow('first ...
- English--动词时态
English|动词时态 时态是一个很玄乎的东西,要么是完全掌握,要么是不知所云. 在正式开始之前,大家需要明白汉语的谓语动词是不会随着时间与状态而变化.但是,英语的谓语动词会随着时间与状态发生变化. ...
- OpenFire后台插件上传获取webshell及免密码登录linux服务器
1.目标获取 (1)fofa.so网站使用搜索body="Openfire, 版本: " && country=JP,可以获取日本存在的Openfire服务器.如图 ...
- linux配置iptables
iptables主要用来配置防火墙.其是一个需要特别谨慎设置的东西,服务器不在身边,不要贸然设置,有可能导致无法SSH,那就麻烦了. 1.首先介绍一下指令和相关配置文件 启动指令:service ip ...
- mysql编译安装下载地址(官网)
https://dev.mysql.com/get/Downloads/MySQL-version number/mysql-version number.tar.gz 把这个地址上面的版本号改成自己 ...
- ubuntu 开启ip包转发
1. 开启IP转发 //临时 # echo "1"> /proc/sys/net/ipv4/ip_forward //永久 # nano /etc/sysctl.conf n ...
- Java梗概
Java平台:J2SE(桌面).J2ME(逐渐被android取代).J2EE(企业级针对web程序) Java是在JVM虚拟机上运行,跨平台本质是在不同平台上运行JVM虚拟机 JRE = JVM+核 ...