Portal -->agc017

Description

  给你\(n\)块积木,每块积木由三个矩形组成,中间的矩形最高高度为\(h\),左边的矩形高度为\(a_i\)离底边高度为\(c_i\),右边的矩形高度为\(b_i\)离底边高度为\(d_i\),现在要求将这些积木全部拼起来,并且中间部分的底边贴底,每个积木的左边和右边矩形的底边必须完全贴底或者完全贴在别的积木上,积木无法旋转或翻转,问是否存在合法的摆放方案

  

Solution

​  感觉。。emmm不是很好想反正我是想不到了

​  一开始有一个比较直接的想法,如果说积木\(i\)的\(c_i\)为\(0\),那么这个积木可以接在\(d_j=a_i\)的积木\(j\)的右边,类似的如果说积木\(i\)的\(d_i\)为\(0\),那么这个积木可以接在\(c_j=b_i\)的积木\(j\)的左边,然后我们可以考虑将这些积木连起来之类的就可以转化成一个图论问题

​  但实际上。。这并不是最好的转化方式

​  注意到\(h<=200\),实际上我们并不需要将积木看成点,我们可以将积木看成边,对于每一个高度建两个点(称为正点(\(P(x)\))和负点(\(N(x)\))),具体什么意思的话就是。。对于一个拼接处,属于右边的那块对应的是正点,属于左边的那块对应的是负点,具体高度的话就是拼接处的高度,这样讲比较不好理解的话。。举个例子:

​  然后这样一来,连边的话就是对于每个积木,左边矩形对应的点向右边矩形对应的点连一条有向边,在上面这幅图来看的话就是\(P(x)\rightarrow N(y)\),那么现在我们的问题就变成了要在这个有向图中找若干条从正点开始在负点结束的路径,使得所有边都被经过一次(因为一条边对应一个积木)

​  这个时候有一个很机智的转化(这个时候应该疯狂orzdcx大神)

  我们新搞一个超级源之类的点,如果说一个图存在一条这样的路径,那么我们从超级源向这条路径的起点连边,从终点再连一条有向边到超级源,那么我们可以得到一条回路,如果说整个图存在满足上述的“所有边都被经过一次”的划分,那么说明整个图(算上超级源)一定弱连通并且存在欧拉回路,具体构造的话就是。。每次从超级源出发走一条这样的路径回来,重复直到所有的边都经过了一次,这个时候将所有连着超级源的边都删掉就是一种合法的划分了

  那么现在要做的就是判断是否存在欧拉回路了

  一个弱连通图如果要存在欧拉回路,必须满足每个点的入度和出度相等,那么我们就首先可以得到两个限制条件:

(1)对于所有的正点,\(in[i]<=out[i]\)(之所以是\(<=\)是因为超级源会向路径起点连一条边,那么路径起点的入度会\(+1\),而我们的回路是放在整个包含超级源的图里面看的,所以是\(<=\))

(2)对于所有的负点,\(out[i]<=in[i]\)(类似地,终点要向超级源连边所以出度会要\(+1\))

  有了这两个条件之后还有一个问题,就是我们并不能保证整个图连通,再具体一点就是我们会漏掉一个弱连通块满足这个弱连通块中的每一个点入度都和出度相等这种情况,这种情况没有办法通过起点终点与超级源连边的方式构造出欧拉回路(因为要求起点和终点一正一负,所以连了边之后起点和终点的出度和入度必定不相等),所以一旦出现这种情况肯定是无解的,否则的话就一定能按照上面说的构造方式构造出一种划分

  

  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define P(x) (x)
#define N(x) (x+h)
using namespace std;
const int N=1e5+10;
int f[N*2],outd[N*2],ind[N*2],ok[N*2];
int n,h;
int get_f(int x){return f[x]=f[x]==x?x:get_f(f[x]);}
void link(int x,int y){
get_f(x); get_f(y);
if (f[x]==f[y]) return;
f[f[y]]=f[x];
}
bool solve(){
for (int i=P(1);i<=P(h);++i)
if (ind[i]>outd[i]) return false;
for (int i=N(1);i<=N(h);++i)
if (ind[i]<outd[i]) return false;
for (int i=P(1);i<=N(h);++i)
if (ind[i]!=outd[i]) ok[get_f(i)]=1;
for (int i=P(1);i<=N(h);++i)
if (!ok[get_f(i)]&&(ind[i]||outd[i])) return false;
return true;
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int a,b,c,d;
int l,r;
scanf("%d%d",&n,&h);
for (int i=P(1);i<=N(h);++i) f[i]=i,ind[i]=outd[i]=0,ok[i]=0;
for (int i=1;i<=n;++i){
scanf("%d%d%d%d",&a,&b,&c,&d);
l=c?N(c):P(a);
r=d?P(d):N(b);
link(l,r);
++outd[l]; ++ind[r];
}
if (solve()) printf("YES\n");
else printf("NO\n");
}

【agc017E】Jigsaw的更多相关文章

  1. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  2. github上最全的资源教程-前端涉及的所有知识体系【转】

    github上最全的资源教程-前端涉及的所有知识体系[转自:蓝猫的博客] 综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.h ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  5. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

随机推荐

  1. 安装Vue.js的方法有三种

    1 使用独立的版本 在Vue.js官网上直接下载,在script标签里引用. 2 使用CND方法(不推荐) 3 NMP 方法 在用Vue.js构建大型应用的时候推荐使用NMP安装方法,NMP能很好的和 ...

  2. selenium自动化之稳定版本环境介绍

    大家都知道,目前selenium版本已经升级到3.0了,selenium3只是在selenium2的基础上做了一些调整,最明显的区别就是 selenium2对Firefox的支持最高只支持46及以下版 ...

  3. git remote add origin错误

    如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...

  4. TPO 02 - Desert Formation

    TPO 02 - Desert Formation NOTE: 主要意思(大概就是主谓宾)用粗体标出:重要的其它用斜体: []中的是大致意思,可能与原文有关也可能无关,但不会离题 目的为训练句子/段落 ...

  5. socket_tcp协议_loadrunner测试

    1.lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:8888", Lrs ...

  6. 获取label标签内for的属性值-js

    <body> <div class="row_2" id="ass"> <label for="aaa"> ...

  7. Amazon及其亏本诱饵策略还能坚持多久?

    Amazon 刚刚公布了最新的财报,亏损 4100 万美元.这是这家电子商务巨头连续 5 个季度以来的第 3 次亏损.但是华尔街似乎却一片叫好声,当日 Amazon 的股价也涨了近 8 个点达 359 ...

  8. java 中的 i=i++

    记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了: ...

  9. 第三次c++作业

    https://github.com/egoistor/3Elevators-scheduling 老实说,因为这周时间紧张,(高数的期中考和一些奇奇怪怪的时期), 所以代码大体是有,但是很多细节处理 ...

  10. 【IdentityServer4文档】- 使用客户端凭据保护 API

    使用客户端凭据保护 API quickstart 介绍了使用 IdentityServer 保护 API 的最基本场景. 接下来的场景,我们将定义一个 API 和一个想要访问它的客户端. 客户端将在 ...