【BZOJ1997】[Hnoi2010]Planar 2-SAT

【BZOJ1997】[Hnoi2010]Planar

Description

Input

Output

Sample Input

2
6 9
1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6
1 4 2 5 3 6
5 5
1 2
2 3
3 4
4 5
5 1
1 2 3 4 5

Sample Output

NO
YES

题解:跟HDU的某熊猫题一模一样?(然而我并没有写那题的题解~)

本题可以理解为圆上有一些点之间要连线,这些线要么在圆里要么在圆外,问能否让所有的线都不相交。

直接枚举出每对可能相交的线,然后一个在圆里另一个就必须在圆外,所以从A向B‘连边,从B向A‘连边就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,T,cnt,tot,sum,top;
int to[1000010],next[1000010],head[2010],dep[2010],low[2010],ins[2010],sta[2010],bel[2010];
int p[2010],pa[20010],pb[20010];
int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
void tarjan(int x)
{
	dep[x]=low[x]=++tot,ins[x]=1,sta[++top]=x;
	for(int i=head[x];i!=-1;i=next[i])
	{
		if(!dep[to[i]])	tarjan(to[i]),low[x]=min(low[x],low[to[i]]);
		else	if(ins[to[i]])	low[x]=min(low[x],dep[to[i]]);
	}
	if(dep[x]==low[x])
	{
		int t;
		sum++;
		do
		{
			t=sta[top--],ins[t]=0,bel[t]=sum;
		}while(t!=x);
	}
}
void add(int a,int b)
{
	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void work()
{
	memset(head,-1,sizeof(head));
	memset(dep,0,sizeof(dep));
	n=rd(),m=rd(),cnt=tot=sum=0;
	int i,j,a,b;
	for(i=0;i<m;i++)	pa[i]=rd(),pb[i]=rd();
	for(i=1;i<=n;i++)	p[rd()]=i;
	if(m>3*n-6)
	{
		printf("NO\n");
		return ;
	}
	for(i=0;i<m;i++)
	{
		pa[i]=p[pa[i]],pb[i]=p[pb[i]];
		if(pa[i]>pb[i])	swap(pa[i],pb[i]);
		if(pa[i]+1==pb[i])	continue;
		for(j=0;j<i;j++)
		{
			if(pa[j]+1==pb[j])	continue;
			if((pa[j]>pa[i]&&pa[j]<pb[i]&&pb[j]>pb[i])||(pa[j]<pa[i]&&pb[j]>pa[i]&&pb[j]<pb[i]))
				add(i<<1|1,j<<1),add(j<<1|1,i<<1),add(i<<1,j<<1|1),add(j<<1,i<<1|1);
		}
	}
	for(i=0;i<2*m;i++)	if(!dep[i])	tarjan(i);
	for(i=0;i<m;i++)	if(bel[i<<1]==bel[i<<1|1])
	{
		printf("NO\n");
		return ;
	}
	printf("YES\n");
	return ;
}
int main()
{
	T=rd();
	while(T--)	work();
	return 0;
}
时间: 2024-11-05 22:00:23

【BZOJ1997】[Hnoi2010]Planar 2-SAT的相关文章

【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Los

【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

[BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路: 1.设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站. 2.每个车站必须被一辆且仅一辆公交车经过(始发站和终点站也算被经过). 3.公交车只能从编号较小的站台驶往编号较大的站台. 4.一辆公交车经过的

【BZOJ 1997】[Hnoi2010]Planar

Description Input Output 找到哈密尔顿环之后找到不在哈密尔顿环上的边 这些边如果同时在里面相交那他们同时在外面也相交,所以只能一外一内,这就变成了2-SAT,判一下就好了 平面图性质 边数<=3*n-6 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int T,n,m,timer,top,cnt,scc; 6 int

【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree

2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答案 更改时,cut(x,next[x]) link(x,min(x+k,n+1)) 记得splay旋转后要更新size 1 #include<bits/stdc++.h> 2 #define N 200005 3 using namespace std; 4 int read(){ 5 int x

【bzoj2001】 Hnoi2010—City 城市建设

http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之后的图的最小生成树边权和. Solution nnd开了半个小时的脑洞,然并卵.感谢这位大爷的代码与题解:http://blog.csdn.net/u013368721/article/details/39183033 我们对时间cdq分治,如何在每一层向下递归的时候减小问题规模呢,两个关键的操作:

【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

(BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct!!!这是一道lct的裸题,只有access操作(10行都没有啊亲...缩行大法的话,我就不说了..)(link操作相当于水过),其实lct很简单..想想都有点小激动...... lct用splay维护的话,一下就写好了..但是我在写lct的时候,发现了一些我原来splay的老问题,我原来也知道了的,就是将null的ch给赋值了,因为在rot操作里没有特判,所以导致了null的孩子被赋值了,导致我的lct

【2-SAT(tarjan)】BZOJ1997-[Hnoi2010]Planar

[题目大意]给出一张存在哈密顿回路的无向图,判断是否是平面图.[思路]首先平面图的一个性质:边数<=点数*3-6因为存在哈密顿回路,可以将回路看作是一个圆,考量不再哈密顿回路中的边.如果两天边相交(判断相交可以随意yy一下),那么必然一条在圆内一条在圆外,显然是2-SAT. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #inclu

【故障处理】一次RAC故障处理过程

[故障处理]一次RAC故障处理过程 1.1  故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版本 RHEL 6.6 1.2  故障处理过程 晚上10点多,一个网友喊我帮忙处理RAC宕机不能启动的问题,并且告知涉及到多路径和存储的事.小麦苗对存储一向不太懂,多路径也没怎么接触,自己也没研究过这个东西.既然找到了我,那就不能不管啊,硬着头皮上去看看.结果悲催了,搞了N个小时,求助了N个人,搞到第

【体系结构】Oracle参数介绍

[体系结构]Oracle参数介绍 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Oracle中的各种参数介绍及其查询方法 ② Oracle中V$PARAMETER及V$PARAMETER2的区别 ③ 隐含参数的查询.重置.清除 ④ 会话参数和实例参数的查询 ⑤ 静态参数和动态参数.延迟参数 ⑥ V$PARAMETER视图的每列含义(重点) Tips: ①