Description

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

\(A\) 国幅员辽阔,边境线上设有 \(M\) 个边防站,顺时针编号 \(1\) 至 \(M\) 。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。 \(n\) 名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。

Input

第 \(1\) 行,包含 \(2\) 个正整数 \(N\) , \(M\) ,分别表示边防战士数量和边防站数量。

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

Output

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

Sample Input

4 8

2 5

4 7

6 1

7 3

Sample Output

3 3 4 3

HINT

\(n \leq 2\times 10^5\),\(M< 10^9\),\(1 \leq Ci,Di \leq M\)


想法

这道题“整个边境线都可覆盖”以及每名战士的区间不会被包含的性质非常好,所以这道题有很多种做法。

先说我的。

显然的贪心,每个战士 \(i\) 的所选择的下一名战士 \(j\) 一定是起点在 \(i\) 的终点前且 \(j\) 可到达的终点最远

拆环为链,某些战士要放两遍。

由于题目的性质,随便推一下发现如果按起点递增排序,那么终点也是递增的。

于是 \(O(n)\) 就可以知道每个战士的后继战士是谁了。

这连成了一棵树,在树上遍历,对每个战士在从树根到它所在的点二分终点的位置就行了。

\(yy\) 的非常开心~这做法常数也不是很大。

标算似乎是倍增。也是知道每个点的后继结点后往后跳嘛,道理是一样的。


代码

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
} const int N = 400005; int n,m;
struct data { int l,r,id; } d[N] ;
bool cmp(data x,data y) { return x.l<y.l; }
int tot,ans[N]; struct node{
int v;
node *nxt;
}pool[N],*h[N];
int cnt;
void addedge(int u,int v){ //u->v
node *p=&pool[++cnt];
p->v=v; p->nxt=h[u]; h[u]=p;
}
int st[N],top;
void dfs(int u){
if(d[u].id<=n){
int l=1,r=top,mid;
while(l<r){
mid=(l+r+1)>>1;
if(st[mid]<d[u].l+m) r=mid-1;
else l=mid;
}
ans[d[u].id]=top-l+2;
}
st[++top]=d[u].r;
for(node *p=h[u];p;p=p->nxt)
dfs(p->v);
top--;
} int main()
{
n=read(); m=read();
int l,r;
for(int i=1;i<=n;i++){
l=read(); r=read();
if(l<=r){
d[++tot]=(data){l,r,i};
d[++tot]=(data){l+m,r+m,i+n};
}
else d[++tot]=(data){l,r+m,i};
}
sort(d+1,d+1+tot,cmp); r=1;
for(int i=1;i<tot;i++){
while(r<tot && d[r+1].l<=d[i].r) r++;
addedge(r,i);
}
dfs(tot);
for(int i=1;i<n;i++) printf("%d ",ans[i]);
printf("%d\n",ans[n]); return 0;
}

[bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划的更多相关文章

  1. 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)

    洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...

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

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

  3. [bzoj4443] [loj#2006] [洛谷P4251] [Scoi2015]小凸玩矩阵

    Description 小凸和小方是好朋友,小方给小凸一个 \(N \times M\)( \(N \leq M\) )的矩阵 \(A\) ,要求小秃从其中选出 \(N\) 个数,其中任意两个数字不能 ...

  4. [倍增]luogu P4155 [SCOI2015]国旗计划

    题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...

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

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

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

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

  7. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

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

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

  9. 洛谷 P1114 “非常男女”计划

    To 洛谷.1114 “非常男女”计划 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人 ...

随机推荐

  1. CF1151div2(Round 553)

    CF1151div2(Round 553) 思路题大赛 A 少考虑了一种情况,到死没想到 B 貌似我随机化50000次,没找到就无解貌似也过了 感觉随随便便乱搞+分类讨论都可以过的样子 #includ ...

  2. SDOI2019热闹又尴尬的聚会

    P5361 [SDOI2019]热闹又尴尬的聚会 出题人用脚造数据系列 只要将\(p\)最大的只求出来,\(q\)直接随便rand就能过 真的是 我们说说怎么求最大的\(p\),这个玩意具有很明显的单 ...

  3. 关于react的redux的知识点

    项目小的时候我们getState()进行管理数据,只有当数据庞大的时候我们采用Redux来进行管理. Redux: ①:它是专注于状态管理的库,和React是解耦的 ②:它是单向数据流,单一的状态 ③ ...

  4. git常用常用操作指令

    GIT操作 1:git init 初始化空的仓库,会在当前文件夹生成一个隐藏.git的文件夹,相当于一个仓库. 2:提交代码的流程:工作代码区-->暂存区 -->主仓库 -->服务器 ...

  5. 【NOIP模拟赛】【数学】完全平方数

    问题描述 一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称平方数. 小A认为所有的平方数都是很perfect的~ 于是他给了小B一个任务:用任意个不 ...

  6. Service Mesh服务网格清单

    Service Mesh服务网格清单 Istio Istio官网 Istio中文官网 Istio开源 无需太多介绍Service Mesh明日之星,扛把子,截止2019.11还有太多问题没解决 复杂性 ...

  7. PHP四大主流框架的优缺点总结

    本篇文章我们来讲讲PHP四大框架的优缺点都有哪些,让你们在开发中更好的去选择使用哪款PHP框架去完成项目,废话不多说,我们一起来看看吧!! ThinkPHP ThinkPHP(FCS)是一个轻量级的中 ...

  8. DEVOPS技术实践_21:Pipeline的嵌套以及流程控制的if和case语句

    1 if控制语句 使用一个简单的If控制语句 pipeline { agent any stages { stage('flow control') { steps { script { == ) { ...

  9. 牛客挑战赛17E 跳格子 计数dp

    !!!学长做过的题 正解:计数dp 解题报告: 传送门 首先思考,这题和普通的走台阶有什么区别嘛(跳格子其实和走台阶都一样的嘛quq因为走台阶比较经典所以就说的走台阶) 那显然最大的区别就是它有限制 ...

  10. 洛谷$2014$ 选课 背包类树形$DP$

    luogu Sol 阶段和状态都是树形DP板子题,这里只讲一下背包的部分(转移)叭 它其实是一个分组背包模型,具体理解如下: 对于一个结点x,它由它的子结点y转移而来 在子结点y为根的树中可以选不同数 ...