POJ3683 Falsita
http://poj.org/problem?id=3683
思路:2-SAT,输出任意一组方案,O(m+n)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
int first[],next[],tot,go[];
int First[],Next[],Tot,Go[];
int b[],a[],n,ru[],low[],dfn[];
int op[],belong[],instack[],vis[],st[],c[],col[],sz,num,top;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void Insert(int x,int y){
Tot++;
Go[Tot]=y;
Next[Tot]=First[x];
First[x]=Tot;
}
bool jud(int x,int y){
if (b[x]<=a[y]||a[x]>=b[y]) return ;
else return ;
}
void build(){
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
if (jud(i*-,j*)){
insert(i*-,j*-);
insert(j*,i*);
}
if (jud(i*-,j*-)){
insert(i*-,j*);
insert(j*-,i*);
}
if (jud(i*,j*)){
insert(i*,j*-);
insert(j*,i*-);
}
if (jud(i*,j*-)){
insert(i*,j*);
insert(j*-,i*-);
}
}
}
void init(){
n=read();
for (int i=;i<=n;i++){
a[i*]=read();
a[i*]=a[i*]*+read();
b[i*-]=read();
b[i*-]=b[i*-]*+read();
int x=read();
b[i*]=a[i*]+x;
a[i*-]=b[i*-]-x;
}
}
void tarjan(int x){
low[x]=dfn[x]=++sz;
instack[x]=vis[x]=;st[++top]=x;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (!vis[pur]){
tarjan(pur);
low[x]=std::min(low[x],low[pur]);
}else if (instack[pur]){
low[x]=std::min(low[x],dfn[pur]);
}
}
if (low[x]==dfn[x]){
num++;
while (st[top]!=x){
instack[st[top]]=;
belong[st[top]]=num;
top--;
}
instack[st[top]]=;
belong[st[top]]=num;
top--;
}
}
void Tarjan(){
for (int i=;i<=*n;i++)
if (!vis[i]) tarjan(i);
}
bool judge(){
for (int i=;i<=n;i++)
if (belong[i*]==belong[i*-]) {
puts("NO");
return ;
}
puts("YES");
return ;
}
void dfs(int x){
if (col[x]) return ;col[x]=-;
for (int i=First[x];i;i=Next[i]){
int pur=Go[i];
dfs(pur);
}
}
void topsort(){
int t=;
for (int i=;i<=num;i++)
if (!ru[i]) c[++t]=i;
while (t){
int now=c[t--];
if (col[now]) continue;col[now]=;
dfs(op[now]);
for (int i=First[now];i;i=Next[i]){
int pur=Go[i];
ru[pur]--;
if (ru[pur]==) c[++t]=pur;
}
}
}
void rebuild(){
for (int i=;i<=*n;i++)
for (int j=first[i];j;j=next[j]){
int pur=go[j];
if (belong[pur]==belong[i]) continue;
ru[belong[i]]++;
Insert(belong[pur],belong[i]);;
}
for (int i=;i<=*n;i++)
op[belong[i*]]=belong[i*-],op[belong[i*-]]=belong[i*];
}
void print(int x){
printf("%.2d:",x/);
printf("%.2d ",x%);
}
void Output(){
for (int i=;i<=n;i++)
if (col[belong[i*]]==){
print(a[i*]);print(b[i*]);puts("");
}else{
print(a[i*-]);print(b[i*-]);puts("");
}
}
int main(){
init();
build();
Tarjan();
if (judge()) return ;
rebuild();
topsort();
Output();
}
为什么我会犯用错数组这种错误。。
POJ3683 Falsita的更多相关文章
- poj3683
poj3683 题意 n对新人举行婚礼,婚礼在不同时间段但可能重叠,婚礼有开始(Si).结束(Ti).仪式举行时间(Di),问能否给出一种举行方案,使得神父能参加所有的婚礼并举行仪式. 分析 xi为真 ...
- [BZOJ3683]Falsita
[BZOJ3683]Falsita 题目大意: 一个\(n(n\le3\times10^5)\)个结点的树,每个结点有一个权值\(w_i\),\(m(m\le3\times10^5)\)次操作,操作包 ...
- 2-sat——输出方案poj3683
一篇讲的详细的博客 https://blog.csdn.net/Hawo11/article/details/74908233 缩点后为什么要建立反图? 如果是按原图处理,选择一个点之后要把所有其后续 ...
- NKOJ-4573 Falsita
问题描述: 到海边了呢...... 如果没有那次选择,现在是不是会好些呢...... 都过去了. 仰望着星空,迎面吹过一阵阵海风,倚靠着护栏,Fine 在海边静静地伫立着,在一个个无际的长夜后,Fin ...
- 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8170 Accept ...
- poj3683 Priest John's Busiest Day
2-SAT 输出可行解 找可行解的方案就是: 根据第一次建的图建一个反图..然后求逆拓扑排序,建反图的原因是保持冲突的两个事件肯定会被染成不同的颜色 求逆拓扑排序的原因也是为了对图染的色不会发生冲突, ...
- poj3683 Priest John's Busiest Day
2-SAT. 读入用了黄学长的快速读入,在此膜拜感谢. 把每对时间当作俩个点.如果有交叉代表相互矛盾. 然后tarjan缩点,这样就能得出当前的2-SAT问题是否有解. 如果有解,跑拓扑排序就能找出一 ...
- 【POJ3683】Priest John's Busiest Day
题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...
- Poj3683:Priest John's Busiest Day
题意 n对夫妻要结婚,第i对夫妻结婚的婚礼持续时间为[Si, Ti],他们会举行一个仪式,仪式时间为Di,这个仪式只能举行在开头或者结尾举行,要么[Si, Si+Di],要么[Ti-Di, Ti],然 ...
随机推荐
- git中的常用指令名及其意义
add 添加新文件到 Git 代码仓库的索引中 $ git add filename mv 移动或重命名文件 $ git mv old-filename new-filename rm 从工作目录和 ...
- Android豆瓣图书查询Demo
原文出自:方杰| http://fangjie.info/?p=26 转载请注明出处 首先先看一下Demo预览效果吧,主要也就是两个Activity.涉及到的技术有zxing开源项目的使用,网络协议豆 ...
- memcached学习——分布式算法(Consistant hash + 虚拟节点)(三)
1.取余算法 优点:数据分布均匀缺点:当服务器动态的添加.删除节点或者某台server down掉,会导致命中率超大幅度下降,甚至导致服务不可用 2.Consistant Hash算法:一致性哈希算法 ...
- 电脑上已经安装mysql之后安装wamp,wamp中的mysql无法启动的解决办法
Wampserver安装完成后无法启动MySQL这有可能是你之前安装过MysqL,因为wampserver内置MySQL.解决的方法就是配置环境变量. 找到我的电脑或计算机右键,打开属性,然后打开高级 ...
- iOS-网络编程(二)文件上传和断点离线下载
一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用)NSUR ...
- SQL Profile 总结(一)
一.前提概述 在介绍SQL Profile之前,不得不说的一个工具就是SQL Tuning Advisor:这个工具是从Oracle 10g開始引入,它的任务就是分析一个指定的SQL语句,并建议怎样使 ...
- Boost库安装与使用
Boost 库非常不错,所以我今天就安了它一下下. Boost 库不是 C++ 标准库的一部分(据说在下一版本号的 C++ 标准会採纳它),但它有一些标准库所没有的非常实用的一些功能,比方我非常须要的 ...
- 怎么样学好C++
声明:这篇文章非本人所写,转自:http://coolshell.cn/articles/4119.html 昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写 ...
- Android浏览图片,点击放大至全屏效果
做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果.如下. 我不知道QQ那个是怎么做的,我的思路如下: 首先,从图片缩略界面跳转到图片详情页面,应该是从一个Ac ...
- linux生成随机密码
通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的), 使用1password 或者 keepass 这种软件生成 ...