【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
【BZOJ4444】[Scoi2015]国旗计划
Description
Input
Output
Sample Input
2 5
4 7
6 1
7 3
Sample Output
HINT
n≤2×10^5,M< 10^9,1≤Ci,Di≤M
题解:遇到环的题,显然要将环倍长一遍变成链做。
先排序,然后对于每个战士,他一定是传给他能传到的,右端点最远的战士,所以可以用双指针法搞定。
然后用倍增的思想,用to[i][j]表示i往后传2^j次会传给谁,查询时像倍增求lca一样查询就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=200010;
struct node
{
int a,b,org;
node(){}
node(int x,int y,int z){a=x,b=y,org=z;}
}p[maxn<<1];
int n,m,tot;
int to[20][maxn<<1],ans[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(const node &a,const node &b)
{
return a.b<b.b;
}
int main()
{
n=rd(),m=rd();
int i,j,a,b;
for(i=1;i<=n;i++)
{
a=rd(),b=rd();
if(a>b) p[++tot]=node(a,b+m,i),p[++tot]=node(a+m,b+m+m,i); //这里把后半句去掉则会WA,不明觉厉
else p[++tot]=node(a,b,i),p[++tot]=node(a+m,b+m,i);
}
sort(p+1,p+tot+1,cmp);
for(i=j=1;i<=tot;i++)
{
for(;j<tot&&p[j+1].a<=p[i].b;j++);
to[0][i]=(i==j)?0:j;
}
for(j=1;(1<<j)<=tot;j++) for(i=1;i<=tot;i++) to[j][i]=to[j-1][to[j-1][i]];
for(i=1;i<=tot;i++)
{
if(p[i].a>m) continue;
a=i,b=0;
for(j=19;j>=0;j--) if(to[j][a]&&p[to[j][a]].b<p[i].a+m) a=to[j][a],b+=(1<<j);
a=to[0][a],b++;
ans[p[i].org]=b+(p[i].org!=p[a].org);
}
for(i=1;i<=n;i++)
{
printf("%d",ans[i]);
if(i<n) printf(" ");
}
return 0;
}
【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增的更多相关文章
- [bzoj4444] 国旗计划 双指针+倍增
Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...
- [BZOJ4444][SCOI2015]国旗计划(倍增)
链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...
- BZOJ4444 SCOI2015国旗计划(贪心+倍增)
链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...
- 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...
- 4444: [Scoi2015]国旗计划|贪心|倍增
由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个, ...
- BZOJ4444 : [Scoi2015]国旗计划
首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...
- [BZOJ4444][SCOI2015]国旗计划-[ST表]
Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...
- [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
随机推荐
- web 前端 常见操作 将时间戳转成日期格式 字符串截取 使用mui制作选项卡
1.将时间戳转成日期格式: //第一种 function getLocalTime(nS) { return new Date(parseInt(nS) * 1000).toLocaleString( ...
- 【Java】Java_10 常量与变量
1.变量(variable) 1.1 我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定! 1.2 Java是一种强类型语言,每个变量都必须声明其 ...
- Java 遍历一个对象的属性 将非空属性赋值给另一个对象
//将origin属性注入到destination中 public <T> void mergeObject(T origin, T destination) { if (origin = ...
- Swift 泛型參数
原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html 本页内容包含:泛型形參语句和泛型实參语句 本节涉及泛型类型.泛型函数以及泛型 ...
- 《windows核心编程》 17章 内存映射文件
内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...
- sql DATEPART() MONTH() convert() cast() dateadd() DATEDIFF() with(nolock)
DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法 DATEPART(datepart,date) date 参数是合法的日期表达式.datepart 参数 ...
- ajaxform 提交,返回JSON时,IE提示下载的问题解决
在使用AJAXform提交表单时,返回的数据格式为JSON,头文件是application/json 时,在 火狐.ie9和谷歌下都能正常解析,在ie7下会提示下载. 解决方法:指定返回页的头文件为& ...
- mac apt-get--> Homebrew
在最近采集linux进程网络指标的时候,为了对比采集结果,需要linux系统查看进程网络流量命令,最后查到nethogs 这个工具好用,但是在下载安装过程中碰到问题: 1:http://blog.cs ...
- PHP 命名空间namespace 和 use
慕课网教程: http://www.imooc.com/video/7834 PHP 中命名空间的概念和高级语言(如C#.JAVA)有很大的差异,一度让我混淆甚至怀疑它存在的意义和目的. 今天找时间学 ...
- Java实现XSS防御
XSS概述 跨站脚本攻击(Cross Site Scripting),缩写为XSS.恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行, ...