【bzoj4444 scoi2015】国旗计划
题目描述
A 国正在开展一项伟大的计划 —— 国旗计划。这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈。这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 NN 名优秀的边防战上作为这项计划的候选人。
A 国幅员辽阔,边境线上设有 MM 个边防站,顺时针编号 11 至 MM 。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。NN 名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。
现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。
输入输出格式
输入格式:
第一行,包含两个正整数 N,MN,M ,分别表示边防战士数量和边防站数量。
随后 NN 行,每行包含两个正整数。其中第 ii 行包含的两个正整数 C_iCi 、D_iDi 分别表示 ii 号边防战士常驻的两个边防站编号,C_iCi 号边防站沿顺时针方向至 D_iDi 号边防站力他的奔袭区间。数据保证整个边境线都是可被覆盖的。
输出格式:
输出数据仅 11 行,需要包含 NN 个正整数。其中,第 jj 个正整数表示 jj 号边防战士必须参加的前提下至少需要多少名边防战士才能顺利地完成国旗计划。
说明
N\leqslant 2×10^5,M<10^9,1\leqslant C_i,D_i\leqslant MN⩽2×105,M<109,1⩽Ci,Di⩽M 。
题意:一个m个点的环,给出n个环上的区间(可能跨越1),求出所有 必须使用区间i而将所有的m都覆盖的最小区间数 ansi;
题解:
①如果不是环,不是多个询问就是一个贪心;
②是环的话断环为链,倍长,把跨越1的拆成三分,其他的拆成两份;同样维护j位置及其左边右端点的最大值(有点绕),每次尽量往前跳; 对于ansi相当于规定了贪心的起点为i的左端点;
③实现具体可以倍增做,但是%%%Claris,对于一个坐标只会有一个最大值,意思就是所有的最大值形成一个以末尾为根的树结构,从后往前dfs遍历,用一个栈存下当前路径上的元素,预先处理没有必选区间的区间覆盖最小值L,所有的ansi和L相差不会超过1,每次向上查L,L+1个元素是否覆盖满记录答案;
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
int n,m,id[N],ans[N],L=-,tot,q[N<<],t,hd[N<<],nt[N<<],sub[N],x[N>>],y[N>>],f[N<<];
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return (p1==p2)?EOF:*p1++;
}
int rd(){
int x=; char c=gc();
while(c<''||c>'') c=gc();
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
void up(int&x,int y){if(x<y) x=y;}
void dfs(int u){
q[++t]=u;
if(u<=tot) for(int i=L;;i++)if(q[t-i]>=u+tot){ans[u]=i;break;}
for(int i=hd[u];i;i=nt[i]) dfs(i); t--;
}
int main()
{ freopen("bzoj4444.in","r",stdin);
freopen("bzoj4444.out","w",stdout);
n=rd(); m=rd(); sub[++tot] = ; sub[++tot] = m;
for(int i=;i<=n;i++) sub[++tot]=x[i]=rd(),sub[++tot]=y[i]=rd();
sort(sub+,sub+tot+); tot = unique(sub+,sub+tot+) - sub - ;
for(int i=;i<=n;i++){
id[i] = x[i] = lower_bound(sub+,sub+tot+,x[i]) - sub;
y[i] = lower_bound(sub+,sub+tot+,y[i]) - sub;
if(x[i]<=y[i]) up(f[x[i]],y[i]),up(f[x[i]+tot],y[i]+tot);
else up(f[],y[i]),up(f[x[i]],y[i]+tot),up(f[x[i]+tot],*tot);
}
for(int i=;i<=*tot;i++) up(f[i],f[i-]);
for(int i=;i<=tot;i=f[i])L++;
for(int i=;i<*tot;i++) nt[i]=hd[f[i]],hd[f[i]]=i;
dfs(*tot);
for(int i=;i<=n;i++) printf("%d ",ans[id[i]]);
return ;
}//by tkys_Austin;
【bzoj4444 scoi2015】国旗计划的更多相关文章
- [BZOJ4444][SCOI2015]国旗计划(倍增)
链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...
- BZOJ4444 SCOI2015国旗计划(贪心+倍增)
链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...
- BZOJ4444 : [Scoi2015]国旗计划
首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...
- 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...
- [BZOJ4444][SCOI2015]国旗计划-[ST表]
Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
- [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- 4444: [Scoi2015]国旗计划
4444: [Scoi2015]国旗计划 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 485 Solved: 232 Description A国 ...
- [luogu] P4155 [SCOI2015]国旗计划(贪心)
P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...
随机推荐
- Beta版本敏捷冲刺每日报告——Day4
1.情况简述 Beta阶段第四次Scrum Meeting 敏捷开发起止时间 2017.11.5 08:00 -- 2017.11.5 22:00 讨论时间地点 2017.11.5晚9:00,软工所实 ...
- 敏捷冲刺每日报告一(Java-Team)
第一天报告(10.25 周三) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- *.db-journal 是什么(android sqlite )数据库删除缓存
sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了.在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束 ...
- java中<> 的用法
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- 聊一聊C#的Equals()和GetHashCode()方法
博客创建一年多,还是第一次写博文,有什么不对的地方还请多多指教. 关于这次写的内容可以说是老生长谈,百度一搜一大堆.大神可自行绕路. 最近在看Jeffrey Richter的CLR Via C#,在看 ...
- zTree根据json选中节点,并且设置其他节点不可选
首先,在适配目录树时,使用checkbox形式,配置代码如下: var settingCatalog = { check:{ enable: true }, data:{ simpleData:{ e ...
- python 面向对象之多态与绑定方法
多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...
- Mosquito集群模式
参考链接: http://blog.csdn.net/z729685731/article/details/70142182 http://blog.csdn.net/yuhaiyang457288/ ...
- python入门(1)python的前景
python入门(1)python的前景 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于 ...
- JS中全等和相等操作符的区别和比较规则
一.两者的区别 相等:先强制转换变量类型,再比较 全等:不转换类型,一旦类型不同,就是不全等. 二.相等和不相等的比较规则 1.操作符中有布尔值时: 比较前先将之转换为数值 false => 0 ...