首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士。

将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出。

那么如果将$f[i]$看成$i$的祖先的话,它实际上形成了一棵以$2n$为根的树。

首先暴力计算出1号点的答案$t$,设$L=t-1$。

然后dfs这棵树,用一个栈按深度依次保存每个点到根路径上的点。

对于一个点,只需要从$L$开始暴力枚举答案,然后$O(1)$检验即可。

因为每个点的答案相差不超过1,所以除去离散化后,整个算法的时间复杂度为$O(n)$。

#include<cstdio>
#include<algorithm>
#define N 400010
int n,m,i,x,y,L,a[N/2][2],b[N],st[N/2],f[N*2],g[N*2],nxt[N*2],q[N*2],t,ans[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int lower(int x){
int l=1,r=m,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void up(int&x,int y){if(x<y)x=y;}
void dfs(int x){
q[++t]=x;
if(x<=m)for(int i=L;;i++)if(q[t-i]>=x+m){ans[x]=i;break;}
for(int i=g[x];i;i=nxt[i])dfs(i);
t--;
}
int main(){
read(n),read(m);
for(m=0,i=1;i<=n;i++)read(a[i][0]),read(a[i][1]),b[++m]=a[i][0],b[++m]=a[i][1];
for(std::sort(b+1,b+m+1),i=1;i<=n;i++){
st[i]=x=lower(a[i][0]),y=lower(a[i][1]);
if(x<y)up(f[x],y),up(f[x+m],y+m);
else up(f[1],y),up(f[x],y+m),up(f[x+m],m+m);
}
for(i=1;i<=m+m;i++)up(f[i],f[i-1]);
for(i=1;i<m+m;i++)nxt[i]=g[f[i]],g[f[i]]=i;
for(L=-1,i=1;i<=m;i=f[i])L++;
dfs(m+m);
for(i=1;i<=n;i++)printf("%d ",ans[st[i]]);
return 0;
}

  

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

  1. [BZOJ4444][SCOI2015]国旗计划(倍增)

    链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...

  2. BZOJ4444 SCOI2015国旗计划(贪心+倍增)

    链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...

  3. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  4. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

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

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

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

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

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

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

  8. 4444: [Scoi2015]国旗计划

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

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

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

随机推荐

  1. NYOJ题目822画图

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAAHzCAIAAABgzHaKAAAgAElEQVR4nO3dPVLjzBoG0LsJ514IsR

  2. linux 普通用户切换成root免密码

    [root@ok ~]# vim /etc/pam.d/su 下面是/etc/pam.d/su文件的内容 #%PAM-1.0 auth sufficient pam_rootok.so # Uncom ...

  3. IIS网站发布若干问题

    1.Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项   未能加载文件或程序集"System.Data.SQLite ...

  4. 字符识别(模板匹配&BP神经网络训练)

    http://blog.csdn.net/zhang11wu4/article/details/7585632

  5. C语言中do...while(0)的妙用

    在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错 ...

  6. httpclient 4.5 get请求

    还是官网靠谱啊 package com.test.httpclient.getpost; import java.io.IOException; import java.util.ArrayList; ...

  7. 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏

    一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...

  8. Oracle【IT实验室】数据库备份与恢复之二:SQL*Loader

    2.1 基本知识 Oracle 的  SQL* LOADER  可以将外部格式化的文本数据加载到数据库表中.通常 与 SPOOL导出文本数据方法配合使用.     1.命令格式 SQLLDR keyw ...

  9. 您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展”处理方法

    转自:http://www.xuebuyuan.com/1549022.html 这已经是一个老掉牙的问题了,部分人使用自己的服务器安装WordPress程序之后,会出现“您的 PHP 似乎没有安装运 ...

  10. C++模板【转】

    1. 模板的概念. 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数 ...