1682. [HAOI2014]贴海报

★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。

张贴规则如下:

1.electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;

2.所有张贴的海报的高度必须与electoral墙的高度一致的;

3.每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;

4.后贴的海报可以覆盖前面已贴的海报或部分海报。

现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。

【输入格式】

第一行:     N   M            分别表示electoral墙的长度和海报个数

接下来M行:   Ai   Bi          表示每张海报张贴的位置

【输出格式】

输出贴完所有海报后,在electoral墙上还可以看见的海报数。

【样例输入】

100 5

1 4

2 6

8 10

3 4

7 10

【样例输出】

4

【提示】

【约束条件】

1 0<= N <= 10000000     1<=M<=1000   1<= Ai <= Bi <=10000000

所有的数据都是整数。数据之间有一个空格

 思路:

  1)首先这道题暴力可以拿80分!(在luogu上可以AC!!!!)

  2)然后考场上作死写了个并查集。。。61分

  3)正解:

      ①线段树(然而我没写~)

      ②浮水法

坑点:

  因为给出的是所位于的块,不是左右端点,所以在处理浮水法的时候记得要右端点+1,或者左端点-1

上代码:

1)暴力

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <string>
  5. #include <cstdio>
  6. using namespace std;
  7.  
  8. const int M = 1e7 + ;
  9. int n,m,l,r,ans;
  10. int a[M],v[M];
  11.  
  12. inline int reads()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while(ch<'' || ch>'')
  16. {if(ch=='-') f=-;ch=getchar();}
  17. while(ch>='' && ch<='')
  18. {x=*x+ch-'';ch=getchar();}
  19. return x*f;
  20. }
  21.  
  22. int main()
  23. {
  24. freopen("ha14d.in","r",stdin);
  25. freopen("ha14d.out","w",stdout);
  26. n=reads(),m=reads();
  27. for(int i=;i<=m;i++)
  28. {
  29. l=reads(),r=reads();
  30. if(r<l) swap(l,r);
  31. for(int j=l;j<=r;j++)
  32. a[j]=i;
  33. }
  34. for(int i=;i<=n;i++)
  35. {
  36. if(!v[a[i]] && a[i])
  37. {
  38. ans++;
  39. v[a[i]]=;
  40. }
  41. }
  42. printf("%d",ans);
  43. return ;
  44. }

2)作死并查集

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <string>
  5. #include <cstdio>
  6.  
  7. using namespace std;
  8.  
  9. inline int reads()
  10. {
  11. int x=,f=;char ch=getchar();
  12. while(ch<'' || ch>'')
  13. {if(ch=='-') f=-;ch=getchar();}
  14. while(ch>='' && ch<='')
  15. {x=*x+ch-'';ch=getchar();}
  16. return x*f;
  17. }
  18.  
  19. const int M = 1e7 + ; ///多开几个
  20. const int N = ;
  21. int n,m;
  22. int f[M];
  23. int ans[M],anse;
  24. int Ls[N],Rs[N];
  25.  
  26. int getf(int x)
  27. {return f[x] == x ? x : f[x] = getf(f[x]);}
  28.  
  29. int main()
  30. {
  31. freopen("ha14d.in","r",stdin);
  32. freopen("ha14d.out","w",stdout);
  33. n=reads();m=reads(); ///n是n块,不是左右端点!!!
  34. for(int i=;i<=n+;i++)
  35. f[i]=i;
  36. for(int i=;i<=m;i++) ///m组数据
  37. { ///手动从1开始,从0不会...
  38. Ls[i]=reads();
  39. Rs[i]=reads()+; ///因为给出不是点的坐标,是块的坐标
  40. }
  41. int l,r;
  42. for(int i=m;i>=;i--) ///逆序张贴,因为只需要的是最后的能看到的海报
  43. {
  44. l=Ls[i],r=Rs[i]; ///左右端点
  45. if(l>r) swap(l,r); ///maybe?会出现"left">"right"的情况(考虑最坏情况,以防万一,以前做过一个题就是恶心的数据!)
  46. for(int j=getf(l);j<=r;j=getf(j+))
  47. {
  48. f[getf(j)]=getf(j+); ///将当前被张贴报纸的父结点手动设置到最后一个的父结点
  49. /// ans[j]=i;
  50. ans[i]++;
  51. if(getf()==n+) break; ///表示已经贴完
  52. }
  53. }
  54.  
  55. for(int i=;i<=n+;i++)
  56. {
  57. /// printf("%d=%d\n",i,ans[i]); ///输出调试???
  58. if(ans[i]) anse++;
  59. }
  60. printf("%d\n",anse);
  61.  
  62. return ;
  63. }

3)正解(浮水法)

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. const int M = ;
  9. int n,m,ans=;
  10. bool v[M];
  11.  
  12. struct U {
  13. int l,r,id;
  14. //id 为第几张海报
  15. }t[M];
  16.  
  17. inline int reads()
  18. {
  19. int x=,f=;char ch=getchar();
  20. while(ch<'' || ch>'')
  21. {if(ch=='-') f=-;ch=getchar();}
  22. while(ch>='' && ch<='')
  23. {x=*x+ch-'';ch=getchar();}
  24. return x*f;
  25. }
  26.  
  27. void swim(int ql,int qr,int nowid,int preid)
  28. {
  29. if(v[preid])
  30. return;
  31. while(nowid<=m && (qr<=t[nowid].l || ql>=t[nowid].r))
  32. nowid++;
  33. if(nowid>m)
  34. {
  35. v[preid]=true;
  36. ans++;
  37. return;
  38. }
  39. if(ql<t[nowid].l && qr>t[nowid].l)
  40. swim(ql,t[nowid].l,nowid+,preid);
  41. if(ql<t[nowid].r && qr>t[nowid].r)
  42. swim(t[nowid].r,qr,nowid+,preid);
  43. }
  44.  
  45. int main()
  46. {
  47. freopen("ha14d.in","r",stdin);
  48. freopen("ha14d.out","w",stdout);
  49. n=reads();m=reads();
  50. for(int i=;i<=m;i++)
  51. {
  52. t[i].l=reads(),t[i].r=reads()+;
  53. t[i].id=i;
  54. }
  55. for(int i=m-;i>=;i--)
  56. swim(t[i].l,t[i].r,i+,i);
  57. printf("%d",ans);
  58. return ;
  59. }

cogs1682. [HAOI2014]贴海报 x的更多相关文章

  1. 【题解】Luogu P3740 [HAOI2014]贴海报

    woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...

  2. 1682. [HAOI2014]贴海报

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] Byteto ...

  3. Luogu P3740 [HAOI2014]贴海报_线段树

    线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...

  4. 洛谷P3740 【[HAOI2014]贴海报】

    (呃...本蒟蒻的第一篇题解qwq)..不废话了讲正题..思路来源于铺地毯(-->传送门)..先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的..但是作为省选题怎么可能 ...

  5. BZOJ5168: [HAOI2014]贴海报 线段树

    Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...

  6. 洛谷P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  7. 【线段树】【P3740】 [HAOI2014]贴海报

    传送门 Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规 ...

  8. 洛谷 P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  9. [haoi2014]贴海报

    Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙.张贴规则如下:1.electoral墙是 ...

随机推荐

  1. [转帖]Java 8新特性探究(九)跟OOM:Permgen说再见吧

    Java 8新特性探究(九)跟OOM:Permgen说再见吧 https://my.oschina.net/benhaile/blog/214159 need study 很多开发者都在其系统中见过“ ...

  2. python实现:递归删除文件并保存删除记录

    说明: 此脚本用于删除指定目录及子目录下符合删除规则的文件,并将删除的文件记录到指定目录下的指定文件,便于查看删除记录. 注意: 此脚本删除的文件,不会进入回收站,将被直接彻底删除,请谨慎操作!!! ...

  3. CVE-2017-17558漏洞学习

    简介 这是USB core中的一个拒绝服务漏洞.带有精心设计的描述符的恶意USB设备可以通过在配置描述符中设置过高的bNumInterfaces值来导致内核访问未分配的内存.虽然在解析期间调整了该值, ...

  4. python:map 函数

    map(func, *iterables) --> map object map()是 Python 内置的高阶函数,它接收一个函数 func 和一个 list(*iterables),并通过把 ...

  5. 关于记录log日志的几种方法

    最近在记录日志的时候总结了几种方式: 1.使用log4j2记录 2.使用log4j记录 3.使用logback配置,记录前使用 private  final Logger logger = Logge ...

  6. STM32F10xxx_启动模式

    目录 STM32F10xxx_启动模式 更新记录 启动配置 参考: STM32F10xxx_启动模式 更新记录 version status description date author V1.0 ...

  7. Linux经典操作

    1.Linux批量终止在运行中包含某个字符串的所有进程. ps -ef|grep celery | grep -v grep|cut -c 9-15|xargs kill -9

  8. svn add 忽略node_modules

    一劳永逸 这个窗口怎么打开 桌面右键,TortoiseSvn,然后点settings,加如下代码,要加空格 node_modules 参考: https://www.leixuesong.cn/336 ...

  9. Nginx默认配置语法

    Nginx默认配置语法 1. 我们进入  /etc/nginx/目录下,打开  nginx.conf文件 2. 我们来解析下 这里面标签和各模块的作用 # 设置nginx服务的系统使用用户 user ...

  10. linux 用户及文件权限管理

    Linux 是一个可以实现多用户登陆的操作系统,比如“李雷”和“韩梅梅”都可以同时登陆同一台主机,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是放在同 ...