AtCoder ARC 076E - Connected?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c
平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次。现在用一条曲线将一对相同的数字连接,对于数字1~N。试判断是否存在一种连接方式,使得曲线不越过矩形网格边界,且曲线之间不相交?
若平面网格为无限大,则使得曲线之间不相交的连接方式一定存在。因此,在一个R×C的网格上,优先考虑边界上的点对,再考虑不全在边界上的点对。将两次均处于边界上的数字的集合记为S。
由于曲线不越过网格边界,因此规定曲线均位于边界内侧。以下只需考虑曲线是否相交。
设集合S中的元素i,j,在边界上出现的顺序为i,j,i,j,则连接i点对的曲线与连接j点对的曲线一定相交;若出现的顺序为i,i,j,j或i,j,j,i,则连接i点对的曲线与连接j点对的曲线不相交。因此,可以考虑用栈(Stack)实现边界点对的检验:沿顺时针方向遍历边界上的点对,若当前栈不为空,且栈顶元素与当前位置的数字相同,则将栈顶元素弹出;否则将当前位置的数字压入栈。如此,若最终栈为空,则答案为YES,否则为NO。
参考程序如下:
- #include <bits/stdc++.h>
- using namespace std;
- #define MAX_N 100010
- int r, c, n;
- stack<int> s;
- struct point {int id, coor;} p[][ * MAX_N];
- int boundary(int x, int y)
- {
- if (x == ) return ;
- else if (y == c) return ;
- else if (x == r) return ;
- else if (y == ) return ;
- else return -;
- }
- bool cmp_inc(point a, point b)
- {
- return a.coor < b.coor;
- }
- bool cmp_dec(point a, point b)
- {
- return a.coor > b.coor;
- }
- int main(void)
- {
- scanf("%d%d%d", &r, &c, &n);
- int cnt[] = {};
- for (int i = ; i <= n; i++) {
- int x[], y[];
- scanf("%d%d%d%d", &x[], &y[], &x[], &y[]);
- bool is_boundary = true;
- for (int j = ; j < ; j++) {
- if (x[j] % r && y[j] % c) is_boundary = false;
- }
- if (is_boundary) {
- for (int j = ; j < ; j++) {
- int t = boundary(x[j], y[j]);
- p[t][cnt[t]].id = i;
- p[t][cnt[t]].coor = t % ? x[j]: y[j];
- cnt[t]++;
- }
- }
- }
- for (int i = ; i < ; i++) {
- if (i < ) sort(p[i], p[i] + cnt[i], cmp_inc);
- else sort(p[i], p[i] + cnt[i], cmp_dec);
- for (int j = ; j < cnt[i]; j++) {
- if (s.size() && s.top() == p[i][j].id)
- s.pop();
- else
- s.push(p[i][j].id);
- }
- }
- if (s.empty()) printf("YES\n");
- else printf("NO\n");
- return ;
- }
AtCoder ARC 076E - Connected?的更多相关文章
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
- AtCoder ARC 076D - Built?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点, ...
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- Atcoder ARC 082C/D
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...
- 【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
随机推荐
- @Repository @Service 和@Autowired 的使用
解释: @Controller 声明Action组件 @Service 声明Service组件 @Service("myMovieLister") @Repositor ...
- android屏幕适配之精准适配
(1554068430@qq.com)(android精准适配工具)近期这段时间项目要做适配,在网上方便的方法.后来依据http://blog.csdn.net/jdsjlzx/article/det ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- Swift备忘录
Swift 备忘录 2015-4 一.简介 1.Swift 语言由苹果公司在2010年7月开始设计,在 2014 年6月推出,在 2015 年 12 月 3 日开源 2.特点(官方): (1)苹果宣称 ...
- Aviator
Aviator 简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢 ...
- springboot创建项目
Springboot作为轻量级快速开发受到无数java人的青睐,Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过 ...
- vue ssr 项目改造经历
vue ssr 项目改造经历 由于工作项目需求,需要将原有的项目改造,vue ssr 没有用到nuxt,因为vue ssr更利于seo,没办法,一个小白的改造经历, 首先说明一下,小白可以借鉴,高手也 ...
- MSSQL:删除系统作业计划
use [msdb]declare @job_name varchar(100)set @job_name = N'EveryDayBackup.Subplan_1'--注:jobName为维护计划对 ...
- 基于bootstarp的Dailog
oaoDailog开发帮助 1. 帮助文档关键字 boostrap模态框oaoDailog 2. 使用场景 当网页上点击某个按钮需要给予用户提示确认,用户点击确认按钮才 ...
- Java基础12一IO流
1.IO流的原理 利用数据通道实现程序和数据源之间数据的的读写操作. 2.IO流分类 输入流.输出流.字节流.字符流.节点流.过滤流 3.InputStream 字节输入流 实现类FileInpu ...