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. android stdio 快捷键

    俗话说工欲善其事必先利其器,先熟悉快捷键是很有必要的                 IDE   按键                                                 ...

  2. 【译】10个机器学习的JavaScript示例

    原文地址:10 Machine Learning Examples in JavaScript 在过去的每一年,用于机器学习(Machine Learning)的库在变得越来越快和易用.一直以来Pyt ...

  3. MySQL 性能优化的最佳20多条经验分享(二)(转)

    11. 尽可能的使用 NOT NULL 除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL.这看起来好像有点争议,请往下看. 首先,问问你自己"Empt ...

  4. SpringBoot入门

    简介 从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置.它使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习 ...

  5. Linxu服务器上安装JDK小白教程

    一.环境 VMware12 Pro CentOS-6.7-i386-bin-DVD1 jdk-8u151-linux-i586 二.详细安装步骤 前提:需要卸载自己Linux上的jdk rpm -qa ...

  6. 从durable谈起,我是如何用搜索引擎抓住技术的关键字学习新姿势打开敏捷开发的大门

    ---又名我讨厌伸手党 我又把个人博客的子标题改为了 你可以在书和搜索引擎找到90%的问题的答案,为什么要问别人?剩下的10%或许没有答案,为什么要问别人? 这是由于最近在网上看到各种伸手,对于我这种 ...

  7. 开发H5基本知识摘要

    一:开发平台 我在公司开发app主要是在apicloud平台上https://www.apicloud.com/,需要开发的同学可以点击进入这个平台了解: 二:开发工具 既然是在apicloud平台上 ...

  8. 【jQuery】复选框的全选、反选,推断哪些复选框被选中

    本文与<[JavaScript]复选框的全选.反选.推断哪些复选框被选中>(点击打开链接)为姊妹篇,把里面内容再与jQuery框架中实现一次,相同做到例如以下的效果: 布局还是相同的布局, ...

  9. Janus 二元神漏洞测试

    同步发表于:http://blog.hacktons.cn/2017/12/25/janus-demo/ 背景 12月9号,Andorid对外曝光了一个名为Janus的重量级系统漏洞CVE-2017- ...

  10. DB主从一致性架构优化4种方法

    需求缘起 大部分互联网的业务都是"读多写少"的场景,数据库层面,读性能往往成为瓶颈.如下图:业界通常采用"一主多从,读写分离,冗余多个读库"的数据库架构来提升数 ...