热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SD省队集训2019Day1之“等你哈苏德”

等你哈苏德(wait)题目描述Joker有一些黑白区间\([l_i,r_i]\),有些区间已经被指定了颜色,有些却没有。你要

等你哈苏德(wait)

题目描述

Joker 有一些黑白区间\([l_i,r_i]\),有些区间已经被指定了颜色,有些却没有。你要指定
这些未染色区间的颜色,使得数轴上对于每个点,覆盖他的黑区间个数和白区间个数差
的绝对值小于等于1。

输入格式

从文件 wait.in 中读入数据。
输入正整数 m, n
接下来 m 行每行三个整数 Li, Ri,wi,保证 1 ≤ Li ≤ Ri ≤ n,wi ∈ [−1, 1]
wi = −1 表示未染色,wi = 0 表示是白色,wi = 1 表示是黑色

输出格式

输出到文件 wait.out 中。
如果无解,输出 −1。
否则输出一行 m 个 0/1 数表示每个区间是黑色还是白色。如果有多解,输出任意一个均可得分。

做法

离散化后,我们就只需要考虑区间的端点处的个数差。
把每个数轴上的点对应到一个图上的点,一个区间\([l_i,r_i]\)视作\(l_i\)\(r_i\)间的一条有向边,其中黑色为从\(l_i\)\(r_i\),白色相反,染色视作定向。
如果沿着每条边遍历各个节点,那么这就是一个欧拉路径问题。所以把奇度数的点排序后依次连接,跑欧拉回路即可。
一部分线段染色相当于是混合图欧拉回路,跑网络流即可。

代码

#include
#define maxn 200100
using namespace std;
namespace WXHAK
{
struct edge
{int r, nxt, w, id;
} e[maxn <<2];
int head[maxn], S, T, q[maxn], esz, l, r, cur[maxn], dep[maxn];
void addedge(int u, int v, int w, int id)
{e[&#43;&#43;esz].r &#61; v;e[esz].nxt &#61; head[u];head[u] &#61; esz;e[esz].w &#61; w;e[esz].id &#61; id;e[&#43;&#43;esz].r &#61; u;e[esz].nxt &#61; head[v];head[v] &#61; esz;e[esz].w &#61; 0;e[esz].id &#61; -id;
}
bool bfs()
{for (int i &#61; S; i <&#61; T; &#43;&#43;i)cur[i] &#61; head[i], dep[i] &#61; 0;l &#61; r &#61; 0, q[r&#43;&#43;] &#61; S, dep[S] &#61; 1;while (l }
int find(int u, int flow)
{if (u &#61;&#61; T)return flow;int used &#61; 0, a &#61; 0;for (int &t &#61; cur[u]; t; t &#61; e[t].nxt)if (e[t].w && dep[e[t].r] &#61;&#61; dep[u] &#43; 1){a &#61; find(e[t].r, min(flow - used, e[t].w));e[t].w -&#61; a, e[t ^ 1].w &#43;&#61; a, used &#43;&#61; a;if (used &#61;&#61; flow)return used;}if (!used)dep[u] &#61; -1;return used;
}
void init(int _S, int _T)
{S &#61; _S, T &#61; _T, esz &#61; 1;for (int i &#61; S; i <&#61; T; &#43;&#43;i)head[i] &#61; 0;
}
int dinic()
{int ans &#61; 0, a &#61; 0;while (bfs())while (a &#61; find(S, 1 <<30))ans &#43;&#61; a;return ans;
}
void cal(int anses[])
{for (int i &#61; 1; i <&#61; esz; &#43;&#43;i)if (!e[i].w && e[i].id)anses[abs(e[i].id)] &#61; e[i].id > 0 ? !anses[abs(e[i].id)] : anses[abs(e[i].id)];
}
} // namespace WXHAKint mtp, in[maxn], out[maxn], anses[maxn], tg[maxn];
int li[maxn], ri[maxn], lx[maxn], wi[maxn], lsh[maxn <<1], tp, n, m;
int main()
{freopen("wait.in", "r", stdin);freopen("wait.out", "w", stdout);scanf("%d%d", &m, &n);for (int i &#61; 1; i <&#61; m; &#43;&#43;i){scanf("%d%d%d", &li[i], &ri[i], &wi[i]);ri[i]&#43;&#43;;lsh[&#43;&#43;tp] &#61; li[i], lsh[&#43;&#43;tp] &#61; ri[i];lx[&#43;&#43;mtp] &#61; li[i], lx[&#43;&#43;mtp] &#61; ri[i];}]sort(lsh &#43; 1, lsh &#43; tp &#43; 1);sort(lx &#43; 1, lx &#43; mtp &#43; 1);tp &#61; unique(lsh &#43; 1, lsh &#43; tp &#43; 1) - lsh - 1;for (int i &#61; 1; i <&#61; m; &#43;&#43;i){li[i] &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, li[i]) - lsh;ri[i] &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, ri[i]) - lsh;}]for (int i &#61; 1; i <&#61; mtp; i &#43;&#61; 2){int x &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, lx[i]) - lsh;int y &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, lx[i &#43; 1]) - lsh;if (x &#61;&#61; y)continue;tg[i] &#61; rand() % 2;if (tg[i] &#61;&#61; 0)in[y]&#43;&#43;, out[x]&#43;&#43;;elsein[x]&#43;&#43;, out[y]&#43;&#43;;}for (int i &#61; 1; i <&#61; m; &#43;&#43;i){int r &#61; (wi[i] &#61;&#61; -1 ? rand() % 2 : wi[i]);anses[i] &#61; r;if (r &#61;&#61; 0)out[li[i]]&#43;&#43;, in[ri[i]]&#43;&#43;;elseout[ri[i]]&#43;&#43;, in[li[i]]&#43;&#43;;}WXHAK::init(0, tp &#43; 1);int sum &#61; 0;for (int i &#61; 1; i <&#61; tp; &#43;&#43;i)if ((in[i] - out[i]) & 1)return puts("-1"), 0;for (int i &#61; 1; i <&#61; tp; &#43;&#43;i){int d &#61; (in[i] - out[i]) / 2;if (d > 0)WXHAK::addedge(WXHAK::S, i, d, 0), sum &#43;&#61; d;else if (d <0)WXHAK::addedge(i, WXHAK::T, -d, 0);}for (int i &#61; 1; i <&#61; m; &#43;&#43;i)if (wi[i] &#61;&#61; -1){if (anses[i] &#61;&#61; 0)WXHAK::addedge(ri[i], li[i], 1, i);elseWXHAK::addedge(li[i], ri[i], 1, i);}for (int i &#61; 1; i <&#61; mtp; i &#43;&#61; 2){int x &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, lx[i]) - lsh;int y &#61; lower_bound(lsh &#43; 1, lsh &#43; tp &#43; 1, lx[i &#43; 1]) - lsh;if (x &#61;&#61; y)continue;if (tg[i] &#61;&#61; 0)WXHAK::addedge(y, x, 1, 0);elseWXHAK::addedge(x, y, 1, 0);}int wxh &#61; WXHAK::dinic();if (wxh !&#61; sum)return puts("-1"), 0;WXHAK::cal(anses);for (int i &#61; 1; i <&#61; m; &#43;&#43;i){if (wi[i] !&#61; -1)printf("%d ", wi[i]);elseprintf("%d ", anses[i]);}
}

简单分析一下&#xff1a;
输入结束后&#xff0c;首先在91~98行离散化。
99~110行&#xff0c;对相邻的两个点之间的边定一个任意的方向。
111~119行&#xff0c;对每个区间对应的边确定方向&#xff08;有限定的不变&#xff09;。
125~132行&#xff0c;源点、汇点加入网络。
133~140行&#xff0c;141~151行&#xff0c;这两种边分别加入网络。
4~75及152~164行&#xff0c;网络流。

转:https://www.cnblogs.com/water-lift/p/10946785.html



推荐阅读
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • 开发笔记:城市建设
    本文由编程笔记#小编为大家整理,主要介绍了城市建设相关的知识,希望对你有一定的参考价值。本文涉及:cdq分治、MST一道十分精妙的cdq分 ... [详细]
  • C语言函数的定义及其含义
    本文目录一览:1、C语言函数的特点及其定义?2 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
  • 为什么即使Linux服务器的socket关闭,客户端仍能调用一次send函数?
    要弄清这个问题,首先需要知道调用send()发送数据时,发生了什么。当调用send()发送数据时,并不是直接将数据发送到网络中,而是先将待发送的数据放到socket发送缓冲区中,然 ... [详细]
  • 捕获图像,用KMPlayer很容易实现。编码,用了强大的maltab生成3000多张用于播放的字符文本。图像的标号为1(1) ... [详细]
author-avatar
韩尕猫_345
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有