[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小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人 ...
随机推荐
- 2018-8-10-win10-uwp-商业游戏-1.2.1
title author date CreateTime categories win10 uwp 商业游戏 1.2.1 lindexi 2018-08-10 19:16:50 +0800 2018- ...
- 深浅Copy的理解
在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝. 而对象又分为两种,一种是不可变对象(字符串.元组.数字 ),一种是可变对象(列表.字典). 而深浅拷贝有三种情况:拷贝的是不可变对象.拷 ...
- [译] 重新思考 1 号进程 / Rethinking PID 1
By Lennart Poettering 译 SReadFox 原文链接:http://0pointer.de/blog/projects/systemd.html 译注:笔者大约在 2011 年读 ...
- maven常用标签
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- centos6.x将python2.6升级到2.7
一,安装开发工具和Python2.7(1)查看当前python版本 python -V Python 2.6.6 (2)下载Python-2.7.3 wget http://python.org/ft ...
- 20191024-2 Alpha阶段贡献分配
此作要求参见: https://edu.cnblogs.com/campus/nenu/2019fall/homework/9858 要求1 每位组员的贡献分值 罗杨美慧:9 徐丽君:11 魏鑫:12 ...
- 洛谷P1020 导弹拦截 题解 LIS扩展题 Dilworth定理
题目链接:https://www.luogu.com.cn/problem/P1020 题目大意: 给你一串数,求: 这串数的最长不上升子序列的长度: 最少划分成多少个子序列是的这些子序列都是不上升子 ...
- 「UVA12004」 Bubble Sort 解题报告
UVA12004 Bubble Sort Check the following code which counts the number of swaps of bubble sort. int f ...
- Django ORM调优实践
一.分析请求慢响应的主要原因 将请求执行的任务按功能分为几块,用time.time()打印每个模块的执行时间,大部分情况下性能会主要消耗在某一个模块上,即80%的性能问题是出在20%的代码上 找到主要 ...
- 小小知识点(四十一)-based和based on的正确理解
A-based B<等价于>B based on A<等价于>B on the basis of A,翻译为基于A的B For example: (1) Radar-based ...