[bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划
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] 国旗计划的更多相关文章
- 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...
- [luogu] P4155 [SCOI2015]国旗计划(贪心)
P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...
- [bzoj4443] [loj#2006] [洛谷P4251] [Scoi2015]小凸玩矩阵
Description 小凸和小方是好朋友,小方给小凸一个 \(N \times M\)( \(N \leq M\) )的矩阵 \(A\) ,要求小秃从其中选出 \(N\) 个数,其中任意两个数字不能 ...
- [倍增]luogu P4155 [SCOI2015]国旗计划
题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...
- [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- 洛谷 P1114 “非常男女”计划
To 洛谷.1114 “非常男女”计划 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人 ...
随机推荐
- vue-learning:26 - component - 组件三大API之一:prop
组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...
- 2018-2-13-win10-uwp-从Type使用构造
title author date CreateTime categories win10 uwp 从Type使用构造 lindexi 2018-2-13 17:23:3 +0800 2018-2-1 ...
- 浅解 go 语言的 interface(许的博客)
我写了一个 go interface 相关的代码转换为 C 代码的样例.也许有助于大家理解 go 的 interface.不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节. ...
- Struts2 类型转换(易百教程)
在HTTP请求中的一切都被视为一个String由协议.这包括数字,布尔值,整数,日期,小数和一切.每一件事情是一个字符串,将根据HTTP.然而,Struts类可以有任何数据类型的属性.Struts的自 ...
- Java正则表达式学习与记录
转载自:http://www.runoob.com/java/java-regular-expressions.html 正则表达式定义了字符串的模式,用于搜索.编辑或处理文本. 1.正则表达式中字符 ...
- Python中三大框架各自的应用场景(DJango,flask,Tornado)
django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实 ...
- numpy :: 计算特征之间的余弦距离
余弦距离在计算相似度的应用中经常使用,比如: 文本相似度检索 人脸识别检索 相似图片检索 原理简述 下面是余弦相似度的计算公式(图来自wikipedia): 但是,余弦相似度和常用的欧式距离的有所区别 ...
- alpha week 2/2 Scrum立会报告+燃尽图 06
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9803 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶, ...
- 获取出口ip or api获取请求者ip
艾玛,这两天为了整这个ip 真的可谓无所不用其极. 在网上查阅了各种资料,其实我想实现的功能很简单 就像百度 直接看到自己的出口ip 奈何查了许多资料,都没有适合的解决办法. 灵机一动,我是不是可以访 ...
- Mysql唯一索引线上故障记录
问题现象: Mysql插入一条数据时,未指定自增键的值却报错:自增键重复,无法插入! 执行SQL INSERT INTO `test`.`test_sort`(`id`, `name`, `age`, ...