题意  给定n个平面上的点,坐标范围为[1, 50000]。如果对于任意两个点,都可以通过直走(中途经过其他点)走到。

   那么输出YES,否则输出NO。

首先排序,去重。

我们要找的点对是只能斜对角走到的点。

那么找到这个点正左边的离他最近的点和正上方最近的点。查询以这三个点为顶点的矩形的内部有没有其他点。

如果有的话就找到了这样的点对,输出NO。

用主席树实现,时间复杂度$O(nlogn)$。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7. #define MP make_pair
  8. #define fi first
  9. #define se second
  10.  
  11. typedef long long LL;
  12. typedef pair <int, int> PII;
  13.  
  14. const int N = 1e6 + 10;
  15. const int M = 5e4 + 10;
  16.  
  17. PII a[N];
  18. map <PII, int> mp;
  19. int n, flag;
  20. int T;
  21. int num;
  22. int mx[M], my[M];
  23. int tot;
  24. int s[N << 3], ls[N << 3], rs[N << 3];
  25. int root[M];
  26.  
  27. void update(int &x, int y, int l, int r, int pos){
  28. x = ++tot;
  29. s[x] = s[y] + 1;
  30. if (l == r) return;
  31. ls[x] = ls[y];
  32. rs[x] = rs[y];
  33. int mid = (l + r) >> 1;
  34. if (pos <= mid) update(ls[x], ls[y], l, mid, pos);
  35. else update(rs[x], rs[y], mid + 1, r, pos);
  36. }
  37.  
  38. int query(int x, int y, int L, int R, int l, int r){
  39. if (l <= L && R <= r) return s[y] - s[x];
  40. int ret = 0;
  41. int mid = (L + R) >> 1;
  42. if (l <= mid) ret += query(ls[x], ls[y], L, mid, l, r);
  43. if (r > mid) ret += query(rs[x], rs[y], mid + 1, R, l, r);
  44. return ret;
  45. }
  46.  
  47. void work1(){
  48. tot = 0;
  49. memset(mx, 0, sizeof mx);
  50. memset(my, 0, sizeof my);
  51. memset(root, 0, sizeof root);
  52. int last = root[0];
  53. rep(i, 1, n){
  54. int x1 = a[i].fi, y1 = a[i].se;
  55. int x2 = a[my[y1]].fi, y2 = a[mx[x1]].se;
  56. update(root[x1], last, 1, 50000, y1);
  57. int cnt = query(root[x2], root[x1], 1, 50000, y2 + 1, y1);
  58. if (cnt != 1){
  59. flag = 0;
  60. return;
  61. }
  62. mx[a[i].fi] = i;
  63. my[a[i].se] = i;
  64. last = root[x1];
  65. }
  66. }
  67.  
  68. int main(){
  69.  
  70. while (~scanf("%d", &n), n){
  71. rep(i, 1, n){
  72. scanf("%d%d", &a[i].fi, &a[i].se);
  73. }
  74.  
  75. a[n + 1].fi = a[n + 1].se = 0;
  76.  
  77. sort(a + 1, a + n + 1);
  78. n = unique(a + 1, a + n + 1) - a - 1;
  79.  
  80. flag = 1;
  81. work1();
  82. rep(i, 1, n) a[i].fi = 50001 - a[i].fi;
  83. sort(a + 1, a + n + 1);
  84. work1();
  85. puts(flag ? "YES" : "NO" );
  86. }
  87.  
  88. return 0;
  89. }

  

HDU 5820 Lights (2016多校7L,主席树)的更多相关文章

  1. HDU - 6601 Keen On Everything But Triangle 主席树

    Keen On Everything But Triangle 感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深 ...

  2. HDU 5732 Subway(2016多校1J,树的重心 + 哈希)

    题目链接  2016多校1 Problem J 题意  给定两棵相同的树,但是编号方案不同.求第一棵树上的每个点对应的第二棵树上的点.输出一种方案即可. 首先确定树的直径的中点.两棵树相等意味着两棵树 ...

  3. HDU 4866 多校1 主席树+扫描线

    终于是解决了这个题目了 不过不知道下一次碰到主席树到底做不做的出来,这个东西稍微难一点就不一定能做得出 离散化+扫描线式的建树,所以对于某个坐标二分找到对应的那颗主席树,即搜索出结果即可(因为是扫描线 ...

  4. BZOJ4408: [Fjoi 2016]神秘数【主席树好题】

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...

  5. BZOJ4408 [Fjoi 2016]神秘数 【主席树】

    题目链接 BZOJ4408 题解 假如我们已经求出一个集合所能凑出连续数的最大区间\([1,max]\),那么此时答案为\(max + 1\) 那么我们此时加入一个数\(x\),假若\(x > ...

  6. HDU 4729 An Easy Problem for Elfness 主席树

    题意: 给出一棵树,每条边有一个容量. 有若干次询问:\(S \, T \, K \, A \, B\),求路径\(S \to T\)的最大流量. 有两种方法可以增大流量: 花费\(A\)可以新修一条 ...

  7. HDU 6621"K-th Closest Distance"(二分+主席树)

    传送门 •题意 有 $m$ 次询问,每次询问求 $n$ 个数中, $[L,R]$ 区间距 $p$ 第 $k$ 近的数与 $p$ 差值的绝对值: •题解 二分答案,假设当前二分的答案为 $x$,那么如何 ...

  8. HDU 5820 Lights(扫描线+zkw线段树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5820 [题目大意] 在一个大小为50000*50000的矩形中,有n个路灯. 询问是否每一对路灯之 ...

  9. HDU 5727 Necklace ( 2016多校、二分图匹配 )

    题目链接 题意 : 给出 2*N 颗珠子.有 N 颗是阴的.有 N 颗是阳的.现在要把阴阳珠子串成一个环状的项链.而且要求珠子的放置方式必须的阴阳相间的.然后给出你 M 个限制关系.格式为 ( A.B ...

随机推荐

  1. 南阳ACM 题目811:变态最大值 Java版

    变态最大值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解决了 ...

  2. 【CodeForces】582 C. Superior Periodic Subarrays

    [题目]C. Superior Periodic Subarrays [题意]给定循环节长度为n的无限循环数列,定义(l,s)表示起点为l的长度为s的子串,(l,s)合法要求将子串从该起点开始以s为循 ...

  3. 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏

    [算法]计算几何 [题解]计算所有斜率排序去重. 实数判断相等用fabs(...)≤eps. ★斜率题一定要注意斜率不存在的情况!!! 其实我觉得这份代码可以hack的…… #include<c ...

  4. vue router mode 设置"hash"与"history"的区别

    router官网的说明如下: ********************************************我是官网说明分隔符--开始**************************** ...

  5. Windows下基于python3使用word2vec训练中文维基百科语料(三)

    对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...

  6. 设计模式之Builder

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象. 将一个复杂 ...

  7. 【JDK】JDK7与JDK8环境共存与切换:先安装jdk7,配置好环境变量后再安装jdk8

    1.先安装JDK7 下载jdk-7u79-windows-i586.exe,安装后配置好环境变量JAVA_HOME,CLASSPATH,PATH java -version javac 指令都正常 2 ...

  8. perl发送post数据

    把post数据写进一个匿名数组里就行 #!/usr/bin/env perl -w use strict; use LWP::UserAgent; my $ua = LWP::UserAgent-&g ...

  9. Override 和 Overload 的含义和区别

    Override 1.方法重写.覆盖: 2.重写是父类与子类之间多态性的一种表现: 3.方法名,参数,返回值相同: 4.存在于子类和父类之间: 5.修饰为final的方法,不能被重写: Overloa ...

  10. Python3 生成器

    生成器(genetor): 1>生成器只有在调用的时候才会生成相应的数据: 2>生成器只记录当前位置,有一个__next__()方法 3>yield可以实现单线程先的并发运算 1.列 ...