以一个这个环为基准,剩下的边可以放在圈外,也可以放在圈内,两种状态。

如果两条线段出现了环上意义的交叉即冲突,即不能同时放在圈外/内。

这是典型的 2-SAT 问题,因为关系传递是无向的,即逆命题与原命题都存在,用并查集维护即可。

关于判断两条线段是否出现了环上意义的交叉:

枚举两条边 \((x_1. y_1), (x_2, y_2)\),如果\(x_2, y_2\) 中的一个在线段所属环的内部,一个在外部,那么肯定分居两侧。

枚举的复杂度是 \(O(TM^2)\) (严格来说要加并查急的复杂度。。)然而直接AC了,这再次告诉我们了 \(O(1e10)\) 不是梦,所以数据过水。

看到 \(std\) 还有个剪枝,就是一个平面图一定满足一个性质:

\(m <= 3n - 6\),不符合直接输出 \(NO\),所以可以把 \(m\) 控制在 \(300\) 左右,这样就跑的动了。


感性证明一下这个性质:

考虑构造最大边数的平面图,而没有重边(题目限制)

目前有一个环,在圈内然后任意找一个点,向除了自己和相邻的点连 \(n - 3\) 条边。在圈外找之前那个点的相邻点,然后向除了自己和相邻的点连 \(n - 3\) 条边,这时候无论连什么边必然相交,所以最大边数就是 \(3n - 6\)。

#include <cstdio>
#include <iostream>
#include <vector>
#define x first
#define y second
using namespace std;
const int N = 205, M = 10005;
typedef pair<int, int> PII;
int n, m, a[N], pos[N], f[M << 1];
PII e[M];
int get(int a, int b, int c) {
a = pos[a], b = pos[b], c = pos[c];
if (a > b) swap(a, b);
return (a < c && c < b) ? 0 : 1;
}
int find(int x) {
return x == f[x] ? x : f[x] = find(f[x]);
}
bool check() {
for (int i = 1; i <= m; i++) if (find(i) == find(i + m)) return false;
return true;
}
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= 2 * m; i++) f[i] = i;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &e[i].x, &e[i].y);
}
for (int i = 1; i <= n; i++) scanf("%d", a + i), pos[a[i]] = i;
if (m > 3 * n - 6) { puts("NO"); continue; }
for (int i = 1; i <= m; i++) {
for (int j = i + 1; j <= m; j++) {
if (e[i].x == e[j].x || e[i].x == e[j].y || e[i].y == e[j].x || e[i].y == e[j].y) continue;
if (get(e[i].x, e[i].y, e[j].x) != get(e[i].x, e[i].y, e[j].y)) {
f[find(i)] = find(j + m), f[find(i + m)] = find(j);
}
}
}
puts(check() ? "YES" : "NO");
}
}

Acwing 403. 平面的更多相关文章

  1. $Poj3714/AcWing\ Raid$ 分治/平面最近点对

    $AcWing$ $Sol$ 平面最近点对板子题,注意要求的是两种不同的点之间的距离. $Code$ #include<bits/stdc++.h> #define il inline # ...

  2. apache httpd服务器403 forbidden的问题

    一.问题描述 在apache2的httpd配置中,很多情况都会出现403. 刚安装好httpd服务,当然是不会有403的问题了.主要是修改了一些配置后出现,问题描述如下: 修改了DocumentRoo ...

  3. [Unity3D]巧妙利用父级子级实现Camera场景平面漫游

    本文系作者原创,转载请注明出处 入门级的笔者想了一上午才搞懂那个欧拉角的Camera旋转..=.= 在调试场景的时候,每次都本能的按下W想前进,但是这是不可能的(呵呵) 于是便心血来潮想顺便添加个Ke ...

  4. 【NEUQACM OJ】1017: 平面切割(特别版)

    1017: 平面切割(特别版) 题目描述 我们要求的是n条闪电型折线分割平面的最大数目.比如,一条闪电型折线可以将平面分成两部分,两条最多可以将平面分成12部分,三条最多可将平面分成31部分,四条最多 ...

  5. 遇到 HTTP 错误 403.14 - Forbidden?

    打开 http://localhost:1609 报错: HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容 解决方案一:设置默认首页 在 Web.conf ...

  6. nginx 访问目录403

    centos7.2默认安装好nginx后,会在/usr/share/nginx/html下作为主目录 但是如果想访问下面的目录会发现没有权限,返回403错误 这时候要注意在/etc/nginx/ngi ...

  7. Apache2.4部署django出现403 Forbidden错误解决办法

    前言:Apache2.4部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹 ...

  8. 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#

    个人亲自编写.测试,可以正常使用   道理看原文,这里不多说   网上找到的几篇基本都不能用的   C#代码 bool Equal(float f1, float f2) { return (Math ...

  9. nginx配置文件或目录404和403

    对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...

随机推荐

  1. 2018.1.22 js

    1.JavaScrip运算符 [案例]a+=b 等价于 a=a+ba-=b 等价于 a=a-ba*=b 等价于 a=a*ba/=b 等价于 a=a/ba%=b 等价于 a%=b2.逻辑控制语句语法1: ...

  2. C#高级编程之特性

    特性定义 MSDN的描述:使用特性,可以有效地将元数据或声明性信息与代码(程序集.类型.方法.属性等)相关联. 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性. 参考此处作者的解释 h ...

  3. webug第八关:CSRF

    第八关:CSRF 用tom用户登陆,进入更改密码界面 用burp构造csrf页面 将构造好的页面放在服务器上,然后点击, admin的密码被更改

  4. PowerPoint无法正常加载MathType的解决方法

    MathType是一款十分便捷的数学公式编辑器,可以和很多办公软件和网站兼容使用,我们日常用的比较多的也就是Office和WPS,更具体的说是Word\Excel\PPT等等一系列办公常用软件. 不过 ...

  5. 视频剪辑软件Camtasia的快捷键大全

    今天来给大家介绍一下Camtasia快捷键的相关内容,Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑制作软件了,可能有些朋友用过,毕竟它在视频录制与制作上确实比较好用. 首先在菜单栏中点击& ...

  6. css3系列之伪类选择器

    Pseudo-Classes Selectors(伪类选择器) E:not(s) E:root E:target E:first-child E:last-child E:only-child E:n ...

  7. 缓存模式(Cache Aside、Read Through、Write Through、Write Behind)

    目录 概览 Cache-Aside 读操作 更新操作 缓存失效 缓存更新 Read-Through Write-Through Write-Behind 总结 参考 概览 缓存是一个有着更快的查询速度 ...

  8. C语言讲义——内联函数

    如果一些函数被频繁调用,不断地有函数入栈(Stack),会造成栈空间的大量消耗. 对应这种问题,可以使用内联函数(inline). 编译器会将内联函数的代码整段插入到调用的位置. #include & ...

  9. C语言讲义——预处理

    C预处理器是一个文本替换工具,在实际编译之前完成一些预先的处理. C预处理器(C Preprocessor)简写为 CPP 预处理器命令都是以#开头,如: #include <stdio.h&g ...

  10. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...