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. MVC过滤器简单理解

    之前对于MVC过滤器的理解一直处于很模糊的状态,就在网上找了一些很简单的案例做了一下学习,就找了一个比较容易理解的demo分享给大家. 新建一个MVC4项目,可以在global.asax文件中看到如下 ...

  2. Python开发目录

    Python开发目录 Python之三目运算符 Python之文件的基本操作

  3. selenium实现自动下载文件

    #coding:utf-8'''说明:导出'''from selenium import webdriverfrom public.highlightElement import highlightf ...

  4. 如何清除PHP中不需要的Layout模板

    最简单的办法就是在需要清除的静态页的最前端加上   {__NOLAYOUT__}  就可以清除所有的layout效果, 继而设置自己的css.js效果.

  5. JDK1.7中HashMap底层实现原理

    一.数据结构 HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象. (方块表示Entry对象,横排表示数组ta ...

  6. 51Nod--1049最大子段和

    1049 最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a ...

  7. mysql的explain

    explain 一般用于分析sql.  如下 [SQL] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 2 ...

  8. Linux积累 命令之cat和wc

    cat主要有三大功能: 1.一次显示整个文件. $ cat   filename 2.从键盘创建一个文件. $ cat  >  filename 只能创建新文件,不能编辑已有文件. 3.将几个文 ...

  9. 了解web及网络基础

    了解web及网络基础 以下内容简单的说明了一下TCP/IP协议族中HTTP协议.DNS服务.IP协议的一些概念和关系.笔者只是对知识点进行了总结,仅供参考: ) 转载请注明出处:了解web及网络基础 ...

  10. Linux压力测试软件Stress安装及使用指南

      一.Stress是什么 stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这些设备运行的用户. 二.安装 将stress的安装包上传并解压到linux服务 ...