题目描述

A 国正在开展一项伟大的计划 —— 国旗计划。这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈。这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 NN 名优秀的边防战上作为这项计划的候选人。

A 国幅员辽阔,边境线上设有 MM 个边防站,顺时针编号 11 至 MM 。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。NN 名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。

现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。

输入输出格式

输入格式:

第一行,包含两个正整数 N,MN,M ,分别表示边防战士数量和边防站数量。

随后 NN 行,每行包含两个正整数。其中第 ii 行包含的两个正整数 C_iCi​ 、D_iDi​ 分别表示 ii 号边防战士常驻的两个边防站编号,C_iCi​ 号边防站沿顺时针方向至 D_iDi​ 号边防站力他的奔袭区间。数据保证整个边境线都是可被覆盖的。

输出格式:

输出数据仅 11 行,需要包含 NN 个正整数。其中,第 jj 个正整数表示 jj 号边防战士必须参加的前提下至少需要多少名边防战士才能顺利地完成国旗计划。

说明

N\leqslant 2×10^5,M<10^9,1\leqslant C_i,D_i\leqslant MN⩽2×105,M<109,1⩽Ci​,Di​⩽M 。

题意:一个m个点的环,给出n个环上的区间(可能跨越1),求出所有 必须使用区间i而将所有的m都覆盖的最小区间数 ansi;

题解:
①如果不是环,不是多个询问就是一个贪心

②是环的话断环为链,倍长,把跨越1的拆成三分,其他的拆成两份;同样维护j位置及其左边右端点的最大值(有点绕),每次尽量往前跳; 对于ansi相当于规定了贪心的起点为i的左端点;

③实现具体可以倍增做,但是%%%Claris,对于一个坐标只会有一个最大值,意思就是所有的最大值形成一个以末尾为根的树结构,从后往前dfs遍历,用一个栈存下当前路径上的元素,预先处理没有必选区间的区间覆盖最小值L,所有的ansi和L相差不会超过1,每次向上查L,L+1个元素是否覆盖满记录答案;

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=;
  6. int n,m,id[N],ans[N],L=-,tot,q[N<<],t,hd[N<<],nt[N<<],sub[N],x[N>>],y[N>>],f[N<<];
  7. char gc(){
  8. static char *p1,*p2,s[];
  9. if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
  10. return (p1==p2)?EOF:*p1++;
  11. }
  12. int rd(){
  13. int x=; char c=gc();
  14. while(c<''||c>'') c=gc();
  15. while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
  16. return x;
  17. }
  18. void up(int&x,int y){if(x<y) x=y;}
  19. void dfs(int u){
  20. q[++t]=u;
  21. if(u<=tot) for(int i=L;;i++)if(q[t-i]>=u+tot){ans[u]=i;break;}
  22. for(int i=hd[u];i;i=nt[i]) dfs(i); t--;
  23. }
  24. int main()
  25. { freopen("bzoj4444.in","r",stdin);
  26. freopen("bzoj4444.out","w",stdout);
  27. n=rd(); m=rd(); sub[++tot] = ; sub[++tot] = m;
  28. for(int i=;i<=n;i++) sub[++tot]=x[i]=rd(),sub[++tot]=y[i]=rd();
  29. sort(sub+,sub+tot+); tot = unique(sub+,sub+tot+) - sub - ;
  30. for(int i=;i<=n;i++){
  31. id[i] = x[i] = lower_bound(sub+,sub+tot+,x[i]) - sub;
  32. y[i] = lower_bound(sub+,sub+tot+,y[i]) - sub;
  33. if(x[i]<=y[i]) up(f[x[i]],y[i]),up(f[x[i]+tot],y[i]+tot);
  34. else up(f[],y[i]),up(f[x[i]],y[i]+tot),up(f[x[i]+tot],*tot);
  35. }
  36. for(int i=;i<=*tot;i++) up(f[i],f[i-]);
  37. for(int i=;i<=tot;i=f[i])L++;
  38. for(int i=;i<*tot;i++) nt[i]=hd[f[i]],hd[f[i]]=i;
  39. dfs(*tot);
  40. for(int i=;i<=n;i++) printf("%d ",ans[id[i]]);
  41. return ;
  42. }//by tkys_Austin;

【bzoj4444 scoi2015】国旗计划的更多相关文章

  1. [BZOJ4444][SCOI2015]国旗计划(倍增)

    链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...

  2. BZOJ4444 SCOI2015国旗计划(贪心+倍增)

    链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...

  3. BZOJ4444 : [Scoi2015]国旗计划

    首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...

  4. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  5. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

  6. 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增

    [BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...

  7. [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)

    [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...

  8. [SCOI2015]国旗计划[Wf2014]Surveillance

    [SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...

  9. 4444: [Scoi2015]国旗计划

    4444: [Scoi2015]国旗计划 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 485  Solved: 232 Description A国 ...

  10. [luogu] P4155 [SCOI2015]国旗计划(贪心)

    P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...

随机推荐

  1. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  2. c/cpp语言链表连接部分详解

    核心代码: ①pTail->next = pNew; ②pNew->next = NULL; ③pTail = pNew; 设结构体名称为 struct ST: 注:方框代表分配的内存空间 ...

  3. Flask jinja2 全局函数,宏

    内置全局函数 dict()函数,方便生成字典型变量 {% set user = dict(name='Mike',age=15) %} <p>{{ user | tojson | safe ...

  4. jstree的简单用法

    一般我们用jstree主要实现树的形成,并且夹杂的邮件增删重命名刷新的功能 下面是我在项目中的运用,采用的是异步加载 $('#sensor_ul').data('jstree', false).emp ...

  5. php面向对象相关内容

    1.什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作 ...

  6. phalcon框架命名空间

    命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...

  7. UDP协议实现客户服务器数据交互

    UDP协议实现客户服务器数据交互 按照往常一样将今天自己写的题目答案写在了博客上习题:客户端循环发送消息给服务端,服务端循环接收,并打印出来,直到收到Bye就退出程序. package network ...

  8. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  9. SpringCloud的应用发布(二)vmvare+linux,Centos7.0下发布应用

    一.运行环境 1.jdk下载安装 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 检查是否有老版本jdk 如 ...

  10. GIT入门笔记(2)- 典型的工作模式

      分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库.   下图是经典的git开发过程.   Git的功能特性:   ...