听说POJ内部测试数据有问题

我这份代码是WA的(UPD:第二份是AC代码),不过目前把discuss的数据试了一下没毛病

自己试了几组好像也没毛病?

感觉线段树部分的简单hash处理方法还是值得学习的,贴出来吧

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #define rep(i,j,k) for(int i=j;i<=k;i++)
  7. using namespace std;
  8. const int maxn = 2e6+11;
  9. bool Hash[30030];
  10. int li[30030],ri[30030];
  11. int arr[maxn],n;
  12. struct ST{
  13. int cover[maxn<<2];
  14. #define lc o<<1
  15. #define rc o<<1|1
  16. void init(){memset(cover,0,sizeof cover);}
  17. void build(int o,int l,int r){
  18. cover[o]=0;
  19. if(l==r) return;
  20. int m=l+r>>1;
  21. build(lc,l,m);
  22. build(rc,m+1,r);
  23. }
  24. void pd(int o){
  25. if(cover[o]){
  26. cover[lc]=cover[rc]=cover[o];
  27. cover[o]=0;
  28. }
  29. }
  30. void update(int o,int l,int r,int L,int R,int v){
  31. if(L<=l&&r<=R){
  32. cover[o]=v;
  33. return;
  34. }
  35. pd(o);
  36. int m=l+r>>1;
  37. if(L<=m) update(lc,l,m,L,R,v);
  38. if(R>m) update(rc,m+1,r,L,R,v);
  39. }
  40. int query(int o,int l,int r,int L,int R){
  41. if(cover[o]){
  42. if(!Hash[cover[o]]){
  43. Hash[cover[o]]=1;
  44. return 1;
  45. }
  46. }
  47. if(l==r) return 0;//base: not found
  48. int m=l+r>>1;
  49. int ans=0;
  50. if(L<=m) ans+=query(lc,l,m,L,R);
  51. if(R>m) ans+=query(rc,m+1,r,L,R);
  52. return ans;
  53. }
  54. }st;
  55. int C(int x){
  56. if(x>=10000000) return 10000000;
  57. else if(x<=1) return 1;
  58. return x;
  59. }
  60. int main(){
  61. int T; scanf("%d",&T);
  62. while(T--){
  63. scanf("%d",&n);
  64. memset(Hash,0,sizeof Hash);
  65. rep(i,1,n){
  66. scanf("%d%d",&li[i],&ri[i]);
  67. arr[i]=li[i];arr[i+n]=ri[i];
  68. }
  69. arr[2*n+1]=1;arr[2*n+2]=10000000;
  70. int tot=2*n+2;
  71. sort(arr+1,arr+1+tot);
  72. int tmp=tot;
  73. rep(i,1,tmp-1){
  74. if(arr[i+1]-arr[i]>1){
  75. arr[++tot]=C(arr[i+1]-1);
  76. arr[++tot]=C(arr[i]+1);
  77. }
  78. }
  79. sort(arr+1,arr+1+tot);
  80. tot=unique(arr+1,arr+1+tot)-arr-1;
  81. rep(i,1,n){
  82. li[i]=lower_bound(arr+1,arr+1+tot,li[i])-arr;
  83. ri[i]=lower_bound(arr+1,arr+1+tot,ri[i])-arr;
  84. // cout<<i<<" "<<li[i]<<" "<<ri[i]<<endl;
  85. }
  86. st.init(); st.build(1,1,tot);
  87. rep(i,1,n){
  88. st.update(1,1,tot,li[i],ri[i],i);
  89. }
  90. printf("%d\n",st.query(1,1,tot,1,tot));
  91. }
  92. return 0;
  93. }

两小时后的UPDATE:

AC代码(忘了pushdown ORZ)

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #define rep(i,j,k) for(int i=j;i<=k;i++)
  7. using namespace std;
  8. const int maxn = 2e6+11;
  9. bool Hash[30030];
  10. int li[30030],ri[30030];
  11. int arr[maxn],n;
  12. struct ST{
  13. int cover[maxn<<2];
  14. #define lc o<<1
  15. #define rc o<<1|1
  16. void build(int o,int l,int r){
  17. cover[o]=0;
  18. if(l==r) return;
  19. int m=l+r>>1;
  20. build(lc,l,m);
  21. build(rc,m+1,r);
  22. }
  23. void pd(int o){
  24. if(cover[o]){
  25. cover[lc]=cover[rc]=cover[o];
  26. cover[o]=0;
  27. }
  28. }
  29. void update(int o,int l,int r,int L,int R,int v){
  30. if(L<=l&&r<=R){
  31. cover[o]=v;
  32. return;
  33. }
  34. pd(o);
  35. int m=l+r>>1;
  36. if(L<=m) update(lc,l,m,L,R,v);
  37. if(R>m) update(rc,m+1,r,L,R,v);
  38. }
  39. int query(int o,int l,int r,int L,int R){
  40. if(cover[o]){
  41. if(!Hash[cover[o]]){
  42. Hash[cover[o]]=1;
  43. return 1;
  44. }
  45. else return 0;
  46. }
  47. pd(o);
  48. if(l==r) return 0;//base: not found
  49. int m=l+r>>1;
  50. int ans=0;
  51. if(L<=m) ans+=query(lc,l,m,L,R);
  52. if(R>m) ans+=query(rc,m+1,r,L,R);
  53. return ans;
  54. }
  55. }st;
  56. int C(int x){
  57. if(x>=10000000) return 10000000;
  58. else if(x<=1) return 1;
  59. return x;
  60. }
  61. int main(){
  62. int T; scanf("%d",&T);
  63. while(T--){
  64. scanf("%d",&n);
  65. memset(Hash,0,sizeof Hash);
  66. rep(i,1,n){
  67. scanf("%d%d",&li[i],&ri[i]);
  68. arr[i]=li[i];arr[i+n]=ri[i];
  69. }
  70. arr[2*n+1]=1;arr[2*n+2]=10000000;
  71. int tot=2*n+2;
  72. sort(arr+1,arr+1+tot);
  73. int tmp=tot;
  74. rep(i,1,tmp-1){
  75. if(arr[i+1]-arr[i]>1){
  76. arr[++tot]=C(arr[i+1]-1);
  77. arr[++tot]=C(arr[i]+1);
  78. }
  79. }
  80. sort(arr+1,arr+1+tot);
  81. tot=unique(arr+1,arr+1+tot)-arr-1;
  82. rep(i,1,n){
  83. li[i]=lower_bound(arr+1,arr+1+tot,li[i])-arr;
  84. ri[i]=lower_bound(arr+1,arr+1+tot,ri[i])-arr;
  85. }
  86. st.build(1,1,tot);
  87. rep(i,1,n){
  88. st.update(1,1,tot,li[i],ri[i],i);
  89. }
  90. printf("%d\n",st.query(1,1,tot,1,tot));
  91. }
  92. return 0;
  93. }

POJ - 2528 奇怪的测试数据的更多相关文章

  1. POJ 2528 Mayor's posters

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  2. poj 2528 Mayor's posters(线段树+离散化)

    /* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...

  3. POJ 2528 Mayor's posters(线段树区间染色+离散化或倒序更新)

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

  4. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  5. poj 2528 (线段树+离散化)

    poj 2528 For each input data set print the number of visible posters after all the posters are place ...

  6. POJ - 2528 Mayor's posters(dfs+分治)

    POJ - 2528 Mayor's posters 思路:分治思想. 代码: #include<iostream> #include<cstdio> #include< ...

  7. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  8. POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  9. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

随机推荐

  1. PCL 编程多个点云合成

    博客转载自:https://blog.csdn.net/sunboyiris/article/details/72636809 pcl::PointCloud<pcl::PointXYZRGBA ...

  2. p2150 [NOI2015]寿司晚宴

    传送门 分析 我们发现对于大于$\sqrt(n)$的数每个数最多只会包含一个 所以我们把每个数按照大质数的大小从小到大排序 我们知道对于一种大质数只能被同一个人取 所以f1表示被A取,f2表示被B取 ...

  3. Part3_lesson4---协处理器访问指令

    1.什么是协处理器? CP15是协处理器, CP15的作用:系统控制协处理器CP15,它提供了额外的寄存器,这些寄存器用于配置和控制cache,MMU,保护系统,时钟模式,和其他的系统项,比如大小端操 ...

  4. eclipse——配置maven插件

    Step 1 配置installations installations:指定Maven核心程序的位置  从本地磁盘中找到本地maven的位置 Step 2 配置user settings user ...

  5. Python基础-4

    目录 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 看列表[0, 1, 2, 3, 4, 5, 6, 7, ...

  6. (转)正则表达式—RegEx(RegularExpressio)(三)

    原文地址:http://www.cnblogs.com/feng-c-x/archive/2013/09/05/3302465.html 今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表 ...

  7. 20169219 SQL注入实验报告

    实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...

  8. LibreOJ 6003 魔术球 (最大流)

    题解:每次加入两个点,对于和为平方数的两个值所对应的点建边,反正网络流可以跑残量网络,所以就没有什么关系了…… 代码如下: #include<cmath> #include<queu ...

  9. 使用java实现单链表----(java中的引用就是指针)

    //一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...

  10. LOJ#10065. 「一本通 3.1 例 2」北极通讯网络

    题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...