题目

有\(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】等你哈苏德的更多相关文章

  1. 5.29 SD省队培训D1

    5.29 SD省队培训D1 自闭的一天 T1 梦批糼 先咕一咕(两天之内一定补上) T2 等你哈苏德 继续咕(一星期之内补上) T3喜欢最最痛 四十分做法: 首先,我们发现同一个点加两条额外边是一件非 ...

  2. 尚德,国美 interview summary

    尚德 Q:SDWebimage源代码,cell重用.先请求出来小头像,再请求出大头像?怎么处理? SDWebImageDownloader 直接给cell设置图片会怎样 A:图片URL相同,比较nsd ...

  3. 2015最新德淘W家(Windeln.de)新人优惠码wcode0520,赠1000积分,可抵10欧元

    德淘W家(Windeln.de)网址:www.windeln.de 德淘W家(Windeln.de)的新人优惠码wcode0520 第一次购物结账时输入wcode0520,提交订单,1000积分划入你 ...

  4. 佛洛依德 c++ 最短路径算法

    //20142880 唐炳辉 石家庄铁道大学 #include<iostream> #include<string> using namespace std; #define ...

  5. 是德科技完成对Anite的收购

    是德科技公司(NYSE:KEYS)日前宣布已经完成对Anite 的收购行动.Anite 是业界领先的无线研发软件解决方案供应商.是德科技通过支付大约6 亿美元现金将其收入麾下,旨在支持是德科技发展无线 ...

  6. [原创.数据可视化系列之五]韩国"萨德"系统防御图

    自从7月8日美国和韩国共同宣布将在韩国部署萨德反导系统后,韩国国内对此事的巨大争议以及本地区一些国家的强烈不满情绪在持续发酵.“萨德”(THAAD)全称“末段高空区域防御系统”,是美国导弹防御局和美国 ...

  7. 用JQ仿造礼德财富网的图片查看器

    现在就职于一家P2P平台,自然也会关注同行其它网站的前端技术,今天要仿造的是礼德内页的一个图片查看器效果.不过说白了,无论人人贷也好礼德财富也好,很多地方的前端都做的不尽如人意,比如忽略细节.缺乏交互 ...

  8. 我所了解的各公司使用的 Ceph 存储集群 (携程、乐视、有云、宝德云、联通等)

    Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解到的一些使用案例. ...

  9. hdu1071(抛物线弓形面积阿基米德算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...

随机推荐

  1. SQL Server 事务日志截断、回绕与收缩(转载)

    每个 SQL Server 数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改. 必须定期截断事务日志以避免它被填满. 但是,一些因素可能延迟日志截断,因此监视日志大小很重要. 某些 ...

  2. Echarts X轴多项百分比的展示

    app.title = '堆叠柱状图'; option = { tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type ...

  3. JavaScript设计模式与开发实践随笔(三)

    封装 1. 封装数据 a)      只能依赖变量的作用域来实现封装特性,es6中可以通过symbol创建私有属性 var myObject = (function(){ var __name = ' ...

  4. 70.JS---利用原生js做手机端网页自适应解决方案rem布局

    利用原生js做手机端网页自适应解决方案rem布局 刚开始我用的是下面这段代码,然后js通过外部链接引入,最后每次用手机刷新网页的时候都会出现缩略图 function getRem(pwidth, pr ...

  5. jquery如何监听浏览器窗口大小并根据不同的大小输出不同的值

    $(window).bind("load resize",function(){ document.documentElement.clientWidth >= 600 ? ...

  6. 常用的本地存储-----cookie篇

    1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器 ...

  7. Cheat Engine 特征码

    打开游戏 引用自动注入 搜索特征码 特征码,是游戏运行中,唯一的汇编代码 验证,特征码是游戏中唯一代码 添加特征码 添加特征码,以及金钱只增不减代码 进行激活测试 特征码,只有在游戏过程中才会执行到 ...

  8. PHP实现单人多人聊天源码免费分享 | 电脑报修系统

    源码清单 1. 简易版登陆式聊天源码. 2. 电脑报修轻系统源码. 3. 关注下面公众号回复“聊天”,免费获取. 聊天系统 虽然微信,QQ是即时通讯的元老.但是他们限制很多,所以很多人都想做一个自己的 ...

  9. Maven项目中jstl表达式失效

    从网上看到的可能原因: 1.包没导入 2.web.xml版本太低,不支持 最后,我一直忽略了的解决办法: 关于jstl和el表达式失效的解决办法 - - ITeye博客 https://aazham. ...

  10. Nexus安装和使用

    1.前言 最近项目需要搭建maven私服,方便管理后期团队成员使用上传自己的包,因此决定使用nexus来搭建私服,搭建好的nexus地址. 2.准备工作 阿里云服务器ECS一台 1核CPU 2G内存( ...