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≤2×10^5,M< 10^9,1≤Ci,Di≤M

Source

这种环的题目考虑断环为链然后倍长来处理;

然后我们发现每个人肯定要跑得越远越好,因为这样覆盖的区间最大,而且他所覆盖的其他人都可以帮他接力,所以不可能差;

那么从每个点选择的接力的人只有一个,就是他覆盖的路径中能跑得最远的那个人,这个用线段树查询一下区间最大值;

既然每个人都只有一个父亲,那么实际上移动构成了一种树的关系,然后我们要快速的处理移动的询问,我门采用倍增来加速移动即可;

注意需要离散化,以及环倍长后的另外一边要做同样的倍增处理;

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long ll;
const int N=500050;
int fa[N*2][18],n,m,c[N*2],d[N*2],tr[N*8];
int hsh[N*2],tot;
void build(int x,int l,int r){
if(l==r) {tr[x]=fa[l][0];return;}
int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
tr[x]=max(tr[lson],tr[rson]);
}
int query(int x,int l,int r,int xl,int xr){
if(xl>xr) return 0;
if(xl<=l&&r<=xr) return tr[x];
int mid=(l+r)>>1;
if(xr<=mid) return query(lson,l,mid,xl,xr);
else if(xl>mid) return query(rson,mid+1,r,xl,xr);
else return max(query(lson,l,mid,xl,mid),query(rson,mid+1,r,mid+1,xr));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x,y;scanf("%d%d",&x,&y);
hsh[++tot]=x,hsh[++tot]=y,hsh[++tot]=m+y,hsh[++tot]=x+m;
c[i]=x;if(x<y) d[i]=y;else d[i]=m+y;
}
sort(hsh+1,hsh+1+tot);tot=unique(hsh+1,hsh+1+tot)-hsh-1;
for(int i=1;i<=tot;i++){
if(hsh[i]==0) cout<<i<<endl;
}
for(int i=1;i<=n;i++){
if(d[i]<=m){
c[i]=lower_bound(hsh+1,hsh+1+tot,c[i])-hsh;
d[i]=lower_bound(hsh+1,hsh+1+tot,d[i])-hsh;
fa[c[i]][0]=d[i];
int cc=lower_bound(hsh+1,hsh+1+tot,hsh[c[i]]+m)-hsh;
int dd=lower_bound(hsh+1,hsh+1+tot,hsh[d[i]]+m)-hsh;
fa[cc][0]=dd;
}
else{
c[i]=lower_bound(hsh+1,hsh+1+tot,c[i])-hsh;
d[i]=lower_bound(hsh+1,hsh+1+tot,d[i])-hsh;
fa[c[i]][0]=d[i];
int cc=lower_bound(hsh+1,hsh+1+tot,hsh[c[i]]+m)-hsh;
fa[cc][0]=tot;
}
}
for(int i=1;i<=tot;i++) if(hsh[i]==0) cout<<i<<endl;
build(1,1,tot);
for(int i=1;i<=n;i++){
fa[d[i]][0]=query(1,1,tot,c[i]+1,d[i]);
if(hsh[d[i]]<=m){
int cc=lower_bound(hsh+1,hsh+1+tot,hsh[c[i]]+m)-hsh;
int dd=lower_bound(hsh+1,hsh+1+tot,hsh[d[i]]+m)-hsh;
fa[dd][0]=query(1,1,tot,cc+1,dd);
}
}
for(int j=1;j<=17;j++){
for(int i=1;i<=tot;i++){
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
for(int i=1;i<=n;i++){
int ret=0,x=c[i];
for(int j=17;j>=0;j--){
if(hsh[fa[x][j]]<hsh[c[i]]+m&&fa[x][j]){
ret+=(1<<j),x=fa[x][j];
}
}
ret++;
printf("%d ",ret);
}
return 0;
}

bzoj 4444: [Scoi2015]国旗计划的更多相关文章

  1. 4444: [Scoi2015]国旗计划

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

  2. 4444: [Scoi2015]国旗计划|贪心|倍增

    由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个, ...

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

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

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

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

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

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

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

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

  7. [SCOI2015]国旗计划

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

  8. 【bzoj4444】[Scoi2015]国旗计划 倍增

    题目描述 给出一个圈和若干段,问:对于所有的 $i$ ,选择第 $i$ 段的情况下,最少需要选择多少段(包括第 $i$ 段)能够覆盖整个圈? 输入 第1行,包含2个正整数N,M,分别表示边防战士数量和 ...

  9. Luogu 4155 [SCOI2015]国旗计划

    BZOJ 4444 倍增 + 贪心. 发现是一个环,先按照套路把环断开复制一倍,这样子的话覆盖完整个环就相当于覆盖一条长度不小于$m$的链,注意这样子有一些区间在新的这条链上会出现两次. 我们为了找到 ...

随机推荐

  1. C#学习笔记——数据库篇(1)

    C#的数据连接分同样分三步走 .连接语句 string str_conn = "sever = localhost;database = smaple;usid = sa;pwd = 123 ...

  2. apache mysql无法启动解决办法

    最近在调试几个代码,需要不停的启动关闭服务器和mysql.在连续的几次开关后,无法启动了,每次启动后就直接关闭. 刚开始是怀疑是不是端口被占用了,查看端口后,并没有端口被占用的情况.查看mysql错误 ...

  3. JavaScript正则表达式(Regular Expression):RegExp对象

    第一部分:新建正则表达式 JavaScript中正则表达式是参照Perl 5(一门历史很悠久的语言,现在tiobe编程语言排行依然在10名左右)建立的. 新建正则表达式的方法有两种: 1.使用字面量( ...

  4. CentOS环境下Docker私有仓库搭建

    本文讲述如何搭建docker私有仓库. 有了docker hub,为什么还要搭建docker私有仓库? 1.性能考虑:docker hub的访问要通过互联网,性能太低. 2.安全性:更多的时候,镜像不 ...

  5. Python中的列表生成器,迭代器的理解

    首先,思考一个问题,比如,我们想生成0-100的列表,我们怎么做? 当然,可以写成 list1=[1,2,3...,100] 可以看出,这种方法不适合生成长的列表,那么Python中就可以利用已有的列 ...

  6. 蓝桥杯 密码脱落 LCS

    9. 密码脱落(后来题目说是有问题,测试用例不会有E出现) X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后 ...

  7. Java调用PDFBox打印自定义纸张PDF

    打印对象 一份设置为A3纸张, 页面边距为(10, 10, 10, 10)mm的PDF文件. PageFormat 默认PDFPrintable无法设置页面大小. PDFPrintable print ...

  8. mac mono Fiddler.exe启动失败

    mono version 5.4 fiddler version 4.6 启动fiddler:mono Fiddler.exe 启动报错 WARNING: The Carbon driver has ...

  9. FSharp 调用 Oracle.ManagedDataAccess.dll

    FSharp 调用 Oracle.ManagedDataAccess.dll 1.Oracle.ManagedDataAccess.dll 的下载地址.好像如今必需要注冊才干下载. 即使是 64 位系 ...

  10. cocos2d+TexturePackerGUI动画制作

    转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/25168047 程序效果图: 1.下载安装TexturePackerGUI 地址:htt ...