题:https://codeforces.com/contest/1284/problem/D

题意:给定n个1对的时间断,我是这么理解的,甲去参加a时间段的讲座,乙去参加b时间段的讲座,然后若这n对中若能挑出这样一个子集段:甲能参加第 i 个时间段的讲座而乙不能。就输出“NO”(注意,甲乙参加讲座的时间段是给定的a时间段,和b时间段,并不是同一个时间段)

分析:枚举a时间段的时间交,然后讲对应的b时间段的时间交加到线段数上,俩者的时间交数一定要相同,因为这些b区间中两两之间也必须在某点交。

   可以理解为“要么都可以去,要么都不可以去”。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M=4e5+;
  4. typedef long long ll;
  5. #define pb push_back
  6. #define lson root<<1,l,midd
  7. #define rson root<<1|1,midd+1,r
  8. struct tree{
  9. int val,lazy;
  10. }tr[M<<];
  11. vector<int>l[M],r[M],lisan;
  12. struct node{
  13. int l,r,id;
  14. }a[M],b[M];
  15. int n;
  16. void build(int root,int l,int r){
  17. if(l==r){
  18. tr[root].val=tr[root].lazy=;
  19. return ;
  20. }
  21. int midd=(l+r)>>;
  22. build(lson);
  23. build(rson);
  24. tr[root].val=tr[root].lazy=;
  25. }
  26. void pushdown(int root){
  27. int x=tr[root].lazy;
  28. tr[root<<].val+=x;
  29. tr[root<<|].val+=x;
  30. tr[root<<].lazy+=x;
  31. tr[root<<|].lazy+=x;
  32. tr[root].lazy=;
  33. }
  34. void up(int root){
  35. tr[root].val=max(tr[root<<].val,tr[root<<|].val);
  36. }
  37. void update(int L,int R,int val,int root,int l,int r){
  38. if(L<=l&&r<=R){
  39. tr[root].val+=val;
  40. tr[root].lazy+=val;
  41. return ;
  42. }
  43. if(tr[root].lazy!=)
  44. pushdown(root);
  45. int midd=(l+r)>>;
  46. if(L<=midd)
  47. update(L,R,val,lson);
  48. if(R>midd)
  49. update(L,R,val,rson);
  50. up(root);
  51. }
  52. int query(int L,int R,int root,int l,int r){
  53. if(L<=l&&r<=R)
  54. return tr[root].val;
  55. if(tr[root].lazy!=)
  56. pushdown(root);
  57. int maxx=,midd=(l+r)>>;
  58. if(L<=midd)
  59. maxx=max(maxx,query(L,R,lson));
  60. if(R>midd)
  61. maxx=max(maxx,query(L,R,rson));
  62. up(root);
  63. return maxx;
  64. }
  65. bool solve(node *a,node *b){
  66. int len=lisan.size();
  67. build(,,len);
  68. for(int i=;i<=len;i++)
  69. l[i].clear(),r[i].clear();
  70. for(int i=;i<=n;i++){
  71. l[a[i].l].pb(i);
  72. r[a[i].r].pb(i);
  73. }
  74. int countt=;
  75. for(int i=;i<=len;i++){
  76. for(int j=;j<l[i].size();j++){
  77. int id=l[i][j];
  78. int L=b[id].l,R=b[id].r;
  79. ///把所有b加上,数量要和与b匹配的a在这个区间上相交的数目countt相同
  80. int mx=query(L,R,,,len);
  81. if(mx!=countt)
  82. return false;
  83. update(L,R,,,,len);
  84. countt++;
  85. }
  86. ///和上面部分合起来是处理区间交的过程
  87. for(int j=;j<r[i].size();j++){
  88. int id=r[i][j];
  89. int L=b[id].l,R=b[id].r;
  90. update(L,R,-,,,len);
  91. countt--;
  92. }
  93. }
  94. return true;
  95. }
  96. int main(){
  97. scanf("%d",&n);
  98. for(int x1,x2,y1,y2,i=;i<=n;i++){
  99. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  100. lisan.pb(x1),lisan.pb(y1),lisan.pb(x2),lisan.pb(y2);
  101. a[i].l=x1,a[i].r=y1,a[i].id=i;
  102. b[i].l=x2,b[i].r=y2,b[i].id=i;
  103. }
  104. sort(lisan.begin(),lisan.end());
  105. lisan.erase(unique(lisan.begin(),lisan.end()),lisan.end());
  106. for(int i=;i<=n;i++){
  107. a[i].l=lower_bound(lisan.begin(),lisan.end(),a[i].l)-lisan.begin()+;
  108. a[i].r=lower_bound(lisan.begin(),lisan.end(),a[i].r)-lisan.begin()+;
  109. b[i].l=lower_bound(lisan.begin(),lisan.end(),b[i].l)-lisan.begin()+;
  110. b[i].r=lower_bound(lisan.begin(),lisan.end(),b[i].r)-lisan.begin()+;
  111. }
  112. if(solve(a,b)&&solve(b,a))
  113. puts("YES");
  114. else
  115. puts("NO");
  116. return ;
  117. }

D. New Year and Conference(区间交,线段树)的更多相关文章

  1. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  2. HDU 5700 区间交 线段树暴力

    枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...

  3. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  4. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  5. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  6. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  7. POJ 2528 - Mayor's posters - [离散化+区间修改线段树]

    题目链接:http://poj.org/problem?id=2528 Time Limit: 1000MS Memory Limit: 65536K Description The citizens ...

  8. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  9. hdu-5700 区间交(二分+树状数组)

    题目链接: 区间交 Problem Description   小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为l​i​​,r​i​​. 它想选择其中k个区间, 使得这些区间的交的那些 ...

  10. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

随机推荐

  1. SFINAE 与 type_traits

    SFINAE 与 type_traits SFINAE 替换失败不是错误 (Substitution Failure Is Not An Error),此特性被用于模板元编程. 在函数模板的重载决议中 ...

  2. Pycharm2020最新激活码|永久激活(附最新激活码和插件)

    最近很多人的Pycharm激活时间又过期了,后台很多人索要激活码,我就再把激活的方法汇和工具再梳理一次给大家. 最主要有两种激活方式(两种方式需要的激活码不同): 一.激活码激活: 一般一年多需要激活 ...

  3. swift中block的使用

    在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值:   案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...

  4. mariadb主从

    实验环境: 两台centos7 master:192.168.1.6 slave:192.168.1.7 一.安装mariadb服务 [root@master ~]# yum -y install m ...

  5. springboot 启动时加载数据库数据到本地Map

    InitDataConfig.java import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Dict; impo ...

  6. C语言备忘录——向上取整

    众所周知,C语言的取整方式是向下取整,昨天老师留了一道思考题,问我们C语言怎么向上取整,当时我第一反应就是ceil(),老师说不能用if……else之类的,函数也不行.当时想了想没事不用就不用,去ma ...

  7. 数组 bash shell

    http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html #!/bin/bash # 脚本检测到离线主机会发送邮件通知,可一直运行. ...

  8. HashMap面试总结

    作者:孤独烟 出处: http://rjzheng.cnblogs.com/ 文章由点及线再及面,写的非常好.修改部分内容 (1) HashMap的实现原理 看过HashMap源码吗,知道原理吗? h ...

  9. JSP变量、方法和类的声明,JSP程序片,JSP表达式

    参考文章 http://c.biancheng.net/view/1431.html http://c.biancheng.net/view/1433.html http://c.biancheng. ...

  10. Spring Cloud Alibaba 教程 | 前世今生

    Spring Cloud Alibaba是什么 先来看一下官方是怎么定义Spring Cloud Alibaba的: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ...