【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 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...
随机推荐
- PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
今天本地调用一个接口报错了: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIR ...
- VS web停止调试后关闭浏览器
- vim:spell语法
先说结论,在vim配置文件加入: setlocal spell spelllang=en_us,cjk 1.spell指开启检查模式. 2.spelllang用于指定检查的种类. 3.cjk,指中国, ...
- Android 权限的一些细节
Android 权限的一些细节 1 哪些app属于system app?为了区分privilege app和system app,这里先说明system app是什么,避免之后的讨论概念混乱. 在Pa ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- 米尔XC7Z010开发板资源
关于XC7Z010开发板 详细介绍http://www.myir-tech.com/product/myc_C7Z010_20.htm Xilinx基于28nm工艺流程的Zynq-7000 All P ...
- 【转载】C#通过Contains方法判断DataTable中是否存在某个列名
在C#中的Datatable数据变量的操作过程中,有时候需要判断DataTable中是否存在某个列名,此时可以通过DataTable对象的Columns列对象集合属性下的Contains方法来进行判断 ...
- FreePascal - CodeTyphon 如何调整代码编辑器背景色?
当前版本的CodeTyphon默认背景色是黑色,看起来很不习惯,通过下面操作,修改了它的代码编辑器的背景色: 1,打开CodeTyphon的菜单“工具”->“选项”. 2,选择左侧列表项目“颜色 ...
- 05-Vue组件
定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...
- Servlet 入门
静态web页面:html+css+js,页面是静态的.不变的,显示给每个用户的页面都一样. 动态web页面:php.jsp.asp,根据用户.实时数据(数据库)来动态显示页面,不同的用户,显示的页面可 ...