题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报。问最后从外面能看到几张不同的海报。

由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于每张海报,有两个端点值,最后能看到几张海报跟他们的端点值的相对大小有关,跟绝对大小无关。所以就把全部海报的端点离散化处理,总共2n个端点,排序去重,相应p(p<=2n)个点。

然后建树,由于p不超过20000,所以这样就能够接受了。区间更新时,由于我们仅仅关心最外面海报的颜色有多少种。所以向下传递节点信息的时候把上面节点的信息去掉。这样在查询的时候就能方便一些,用一个标记数组记录总共同拥有多少种颜色就能够了。

代码:

  1. #include <cstdlib>
  2. #include <cctype>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include<climits>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <string>
  10. #include <iostream>
  11. #include <sstream>
  12. #include <map>
  13. #include <set>
  14. #include <queue>
  15. #include <stack>
  16. #include <fstream>
  17. #include <numeric>
  18. #include <iomanip>
  19. #include <bitset>
  20. #include <list>
  21. #include <stdexcept>
  22. #include <functional>
  23. #include <utility>
  24. #include <ctime>
  25. using namespace std;
  26.  
  27. #define PB push_back
  28. #define MP make_pair
  29.  
  30. #define REP(i,x,n) for(int i=x;i<(n);++i)
  31. #define FOR(i,l,h) for(int i=(l);i<=(h);++i)
  32. #define FORD(i,h,l) for(int i=(h);i>=(l);--i)
  33. #define SZ(X) ((int)(X).size())
  34. #define ALL(X) (X).begin(), (X).end()
  35. #define RI(X) scanf("%d", &(X))
  36. #define RII(X, Y) scanf("%d%d", &(X), &(Y))
  37. #define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
  38. #define DRI(X) int (X); scanf("%d", &X)
  39. #define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
  40. #define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
  41. #define OI(X) printf("%d",X);
  42. #define RS(X) scanf("%s", (X))
  43. #define MS0(X) memset((X), 0, sizeof((X)))
  44. #define MS1(X) memset((X), -1, sizeof((X)))
  45. #define LEN(X) strlen(X)
  46. #define F first
  47. #define S second
  48. #define Swap(a, b) (a ^= b, b ^= a, a ^= b)
  49. #define Dpoint strcut node{int x,y}
  50. #define cmpd int cmp(const int &a,const int &b){return a>b;}
  51.  
  52. /*#ifdef HOME
  53. freopen("in.txt","r",stdin);
  54. #endif*/
  55. const int MOD = 1e9+7;
  56. typedef vector<int> VI;
  57. typedef vector<string> VS;
  58. typedef vector<double> VD;
  59. typedef long long LL;
  60. typedef pair<int,int> PII;
  61. //#define HOME
  62.  
  63. int Scan()
  64. {
  65. int res = 0, ch, flag = 0;
  66.  
  67. if((ch = getchar()) == '-') //推断正负
  68. flag = 1;
  69.  
  70. else if(ch >= '0' && ch <= '9') //得到完整的数
  71. res = ch - '0';
  72. while((ch = getchar()) >= '0' && ch <= '9' )
  73. res = res * 10 + ch - '0';
  74.  
  75. return flag ? -res : res;
  76. }
  77. /*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/
  78. int data[100000+10];
  79.  
  80. int n;
  81. int a[20010];
  82. int b[20010];
  83. int u[40000];
  84.  
  85. void pushdown(int rt)
  86. {
  87. if(data[rt]!=-1)
  88. {
  89. data[rt<<1]=data[(rt<<1)+1]=data[rt];
  90. data[rt]=-1;
  91. }
  92. }
  93. void build(int l,int r,int rt)
  94. {
  95. if(l==r)
  96. {
  97. data[rt]=-1;
  98. return;
  99. }
  100. int m=(l+r)>>1;
  101. build(l,m,rt<<1);
  102. build(m+1,r,(rt<<1)+1);
  103. }
  104. void update(int l,int r,int rt,int a,int b,int c)
  105. {
  106. if(a<=l&&r<=b)
  107. {
  108. data[rt]=c;
  109. return;
  110. }
  111. pushdown(rt);
  112. int m=(l+r)>>1;
  113. if(a<=m)
  114. update(l,m,rt<<1,a,b,c);
  115. if(b>m)
  116. update(m+1,r,(rt<<1)+1,a,b,c);
  117. }
  118. int vis[20010];
  119. int sum;
  120. void query(int l,int r,int rt)
  121. {if(data[rt]!=-1)
  122. {
  123. if(!vis[data[rt]])
  124. {
  125. vis[data[rt]]=1;
  126. sum++;
  127. }
  128. return;
  129. }
  130. int m=(l+r)>>1;
  131. query(l,m,rt<<1);
  132. query(m+1,r,(rt<<1)+1);
  133.  
  134. }
  135.  
  136. int main()
  137. {
  138. int c;
  139. RI(c);
  140. while(c--)
  141. {RI(n);
  142. REP(i,0,n)
  143. {
  144. RII(a[i],b[i]);
  145. }
  146. REP(i,0,n)
  147. {
  148. u[i]=a[i];
  149. u[i+n]=b[i];
  150. }
  151. sort(u,u+2*n);
  152. int p=unique(u,u+2*n)-u;
  153. REP(i,0,n)
  154. {int t=lower_bound(u,u+p,a[i])-u;
  155. a[i]=t+1;
  156. t=lower_bound(u,u+p,b[i])-u;
  157. b[i]=t+1;
  158. }
  159. build(1,p,1);
  160. REP(i,0,n)
  161. {
  162. update(1,p,1,a[i],b[i],i);
  163. }
  164. MS0(vis);
  165. sum=0;
  166. query(1,p,1);
  167. printf("%d\n",sum);
  168. }
  169.  
  170. return 0;
  171. }

线段树区间更新,区间统计+离散化 POJ 2528 Mayor&#39;s posters的更多相关文章

  1. POJ 2528 Mayor&#39;s posters 离散化+线段树

    题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...

  2. POJ 2528 Mayor&#39;s posters 离散化和线段树题解

    本题就是要往墙上贴海报,问最后有多少可见的海报. 事实上本题的难点并非线段树,而是离散化. 由于数据非常大,直接按原始数据计算那么就会爆内存和时间的. 故此须要把数据离散化. 比方有海报1 6   7 ...

  3. poj 2528 Mayor&#39;s posters

    这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash  和线段树成段更新 由于有10000个人竞选 ...

  4. poj 2528 Mayor&#39;s posters 【线段树 + 离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50643   Accepted: 14675 ...

  5. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  6. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  7. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  8. hdu 1166线段树 单点更新 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. hdu2795(线段树单点更新&区间最值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要 ...

随机推荐

  1. 零基础学Python不迷茫——基本学习路线及教程!

    什么是Python? 在过去的2018年里,Python成功的证明了它自己有多火,它那“简洁”与明了的语言成功的吸引了大批程序员与大数据应用这的注意,的确,它的实用性的确是配的上它的热度.   Pyt ...

  2. 组队赛Day1第一场 GYM 101350 F. Monkeying Around(线段树)

    [题目大意] 有n只猴子坐在树上,m个笑话. 给出每个讲这个笑话的猴子的编号,笑话的编号,和笑话的影响半径. 如果一个树上的猴子听了没听过的笑话,会掉到树下.如果听过并且在树下,就会爬到树上. 问最后 ...

  3. Uiautomator简介及其环境搭建、测试执行

    UiAutomator框架使用指南 UiAutomator是Google开发的自动化测试工具,通过UI创建自动化测试代码,来测试界面(UI)的有效功能,可以针对应用程序运行在一个或更多的设备上.我们并 ...

  4. ubuntu下svn在挂在的NTFS分区上无法报错,提示没有权限

    终极解决方案: 赋予svn文件root权限 1. 查找svn文件: $ whereis svn svn: /usr/bin/svn /usr/bin/X11/svn /usr/share/.gz $ ...

  5. Docker存储和网络

    Docker存储资源类型 docker两种存储资源类型 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到 ...

  6. 1. Go的安装和第一行代码

    Go 语言环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Windows 安装包下载地址为:https://golang.org/dl/. 如 ...

  7. Wp8 读取手机信息

    /// <summary> /// 获取系统信息 /// </summary> private void GetSystemInfo() { lblMsg.Text = str ...

  8. Python常用操作符

    Python常用操作符 1.成员关系操作符in 显示的数字前面填充'0'代替空格 6.转义字符 符号 含义 \' 单引号\" 双引号\a 发出系统响铃声\b 退格符\n 换行符\t 横向制表 ...

  9. 算法复习——欧拉回路混合图(bzoj2095二分+网络流)

    题目: Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车 ...

  10. 算法复习——单调队列(sliding windows,ssoi)

    题目: 题目描述 给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表: