zoukankan      html  css  js  c++  java
  • 【arc076E】Connected?

    Portal -->arc076E

    Description

      给你一个(R*C)的矩形,矩形中某些格子的端点上填了(1sim n)(n)个数字,每个数字出现了恰好两遍,现在要将每一对数字用曲线连起来,线不允许出矩形,问是否存在一种连线方案使得任意两条线不相交

      数据范围:(1<=R,C<=10^8,1<=n<=10^5)

      

    Solution

      结论题什么的。。==

      实际上我们可以将。。这个连线看成一个。。类似切割的操作,不停地切这个平面,然后如果说两个部分不相连了那么不能存在一对点分别存在于两个部分

    ​  这样转化一下之后就比较直观了,注意到如果说我们连的(切的)不是两个点都在边界上的一对点,这个平面并不会有新的不相连的部分产生,也就是说如果不存在连个点都在边界上这样的点对,就一定存在一种连线方式(各种缝隙绕来绕去之类的)满足要求

      那么所以我们只要考虑那些两个点都在边界上的点对就好了,只要这些点对之间的连边不存在冲突,整个就肯定有解了,所以接下来提到的点对都是满足两个点都在边界上的点对

      注意到一旦连了一对这样的点对,就会将其所在的平面部分分成两个独立的部分,而这两个部分之间不能连边,所以我们可以考虑从矩形的左上角开始,沿着边界顺时针转一圈,按顺序将沿路上所有的点列成一排,如果说一对点之间夹有不完整的一个点对(也就是。。一对点之间只有某个点对的其中一个),那么就说明这两个点对会有冲突(按照其中一个点对将平面分成两个部分之后,另一个点对的两个点必定会被分在两个不相连的部分),那就凉凉了,这个过程我们用一个栈模拟一下即可

      

      mark:直观转化(可能做题需要一点想象力==)

      

      代码大概长这个样子

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10,add=1e8+1;
    struct Data{
    	int x,id;
    	friend bool operator < (Data x,Data y){return x.x<y.x;}
    }rec[N*2];
    int st[N];
    int n,m,tot,D;
    int change(int x,int y){
    	if (x==1) return y;
    	if (y==m) return x+add;
    	if (x==n) return m-y+1+add*2;
    	if (y==1) return n-x+1+add*3;
    	return -1;
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
    	freopen("a.in","r",stdin);
    #endif
    	int x1,y1,x2,y2,tmp1,tmp2;
    	scanf("%d%d%d",&n,&m,&D);
    	++n; ++m;
    	for (int i=1;i<=D;++i){
    		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    		++x1; ++y1; ++x2; ++y2;
    		tmp1=change(x1,y1);
    		tmp2=change(x2,y2);
    		if (tmp1==-1||tmp2==-1) continue;
    		rec[++tot].x=tmp1; rec[tot].id=i;
    		rec[++tot].x=tmp2; rec[tot].id=i;
    	}
    	sort(rec+1,rec+1+tot);
    	int top=0;
    	for (int i=1;i<=tot;++i){
    		if (st[top]==rec[i].id)
    			--top;
    		else
    			st[++top]=rec[i].id;
    	}
    	if (top) printf("NO
    ");
    	else printf("YES
    ");
    }
    
  • 相关阅读:
    IIS和ASP.NET2.0
    VS.NET里关于不能够使用向导的问题
    CodeFile
    判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)
    托管和非托管资源
    ASP.NET 2.0页面框架的几处变化
    导出QQWry.Dat中IP地址到文件[C#]
    面向对象在数据库应用程序中的应用(dotNet)
    如何取得IP/用户名等信息
    验证Email是否真正存在(上)
  • 原文地址:https://www.cnblogs.com/yoyoball/p/9798923.html
Copyright © 2011-2022 走看看