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

题面

题面较长,略

分析

首先套路的断环为链。对于从l到r的环上区间,若l<=r,我们把它断成两个区间\([l,r],[l+M,r+M]\),否则断成\([l,r+M],[l+M,r+M+M]\)(断成\([l+M,2M]\)也可以)

然后定义从区间[l,r]走到另一个与它相交的区间为1“步”。那么我们可以预处理出区间i走j步能够到达的区间右端点的最大值。注意到区间互不包含,先把区间按左端点为第一关键字,右端点为第二关键字排序。对于区间i,我们找到满足\(l_i<l_j \leq r_i\)的最大\(l_j\),那么\(r_j\)就是走1步能到达的最大区间右端点。因为\(l_j>l_i\),所以\(r_j>r_i\),否则区间j就会被i包含。由于排序过,j显然有单调性,双指针扫一遍就可以了。

	sort(a+1,a+1+sz);
int ptr=1;
for(int i=1;i<=sz;i++){
while(ptr<sz&&a[ptr+1].l<=a[i].r) ptr++;
if(ptr!=i) anc[i][0]=ptr;
}

但是枚举走j步依然是\(O(n^2)\)的,可以用倍增优化。\(anc[i][j]\)表示区间i走j步到达的右端点最大的区间编号。这个可以\(O(n \log n)\)预处理。

查询的时候从i开始跳,一直跳到\(r_{anc[i][j]}\geq l_i+M\)为止,需注意边界条件

int query(int x){
int ans=1;
int r=a[x].l+len; //注意边界,比如3->5,5->1,1->3.必须要跳回原点3,所以是+len而不是+len-1
for(int i=log2n;i>=0;i--){
if(anc[x][i]!=0&&a[anc[x][i]].r<=r){//如果右端点<=i+M,就继续跳
ans+=(1<<i);
x=anc[x][i];
}
}
if(anc[x][0]&&a[x].r<r){//上面求的是右端点<=i+M,可能跳到了<i+M的某一个位置,再跳一步就超过i+M,这种情况也是合法的。特判一下。
ans++;
x=anc[x][0];
}
return ans; //保证一定有解,所以不用判断a[x].r是否>=r
}

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 2000000
#define maxlogn 25
using namespace std;
int n,len;
struct seg{
int l;
int r;
int id;
seg(){ }
seg(int _l,int _r,int _id){
l=_l;
r=_r;
id=_id;
}
friend bool operator < (seg p,seg q){
if(p.l==q.l) return p.r<q.r;
else return p.l<q.l;
}
}a[maxn+5];
int sz;
int log2n;
int ans[maxn+5];
int anc[maxn+5][maxlogn+5]; int query(int x){
int ans=1;
int r=a[x].l+len; //注意边界,比如3->5,5->1,1->3.必须要跳回原点3,所以是+len而不是+len-1
for(int i=log2n;i>=0;i--){
if(anc[x][i]!=0&&a[anc[x][i]].r<=r){
ans+=(1<<i);
x=anc[x][i];
}
}
if(anc[x][0]&&a[x].r<r){
ans++;
x=anc[x][0];
}
return ans;
}
int main(){
int l,r;
scanf("%d %d",&n,&len);
log2n=log2(n*2);
for(int i=1;i<=n;i++){
scanf("%d %d",&l,&r);
if(l<=r){
a[++sz]=seg(l,r,i);
a[++sz]=seg(l+len,r+len,i+n);
}else{
a[++sz]=seg(l,r+len,i);
a[++sz]=seg(l+len,r+len+len,i+n);
}
}
sort(a+1,a+1+sz);
int ptr=1;
for(int i=1;i<=sz;i++){
while(ptr<sz&&a[ptr+1].l<=a[i].r) ptr++;
if(ptr!=i) anc[i][0]=ptr;
}
for(int j=1;j<=log2n;j++){
for(int i=1;i<=sz;i++){
anc[i][j]=anc[anc[i][j-1]][j-1];
}
}
for(int i=1;i<=sz;i++){
if(a[i].id<=n) ans[a[i].id]=query(i);//注意要跳过(l+n,r+n),否则l+len会超过2*len导致答案错误
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
}

[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)的更多相关文章

  1. 【bzoj4444】[Scoi2015]国旗计划 倍增

    题目描述 给出一个圈和若干段,问:对于所有的 $i$ ,选择第 $i$ 段的情况下,最少需要选择多少段(包括第 $i$ 段)能够覆盖整个圈? 输入 第1行,包含2个正整数N,M,分别表示边防战士数量和 ...

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

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

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

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

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

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

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

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

  6. 4444: [Scoi2015]国旗计划

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

  7. [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)

    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...

  8. [bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划

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

  9. bzoj 4444: [Scoi2015]国旗计划

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

随机推荐

  1. 2019JAVA最新课程-React从入门到实战(新)

    1.准备工作 可以在yunp.top网站看webpack,node/npm,cnpm的相关使用视频教程 react有两种使用方式,一是在现有网站中添加:二是创建一个全新的 官网创建全新一个react ...

  2. 百分号编码(URL编码)

    百分号编码又叫做URL编码,是一种编码机制,只要用于URI(包含URL和URN)编码中. URL中那些字符需要编码,又为什么进行编码 一.URL是什么?  URL(Uniform Resource L ...

  3. linux-dns-11

    1网卡设置配置文件里面DNS服务器地址设置,2.系统默认DNS服务器地址设置.3,hosts文件指定 生效顺序是: 1 hosts文件 ---- 2 网卡配置文件DNS服务地址 ---3 /etc/r ...

  4. html audio标签 语法

    html audio标签 语法 audio标签的作用是什么? 作用:<audio> 标签定义声音,比如音乐和视频或其他音频资源,使用audio标签可以不用Flash插件就可以听音乐看视频, ...

  5. FP AUTO节点ZPP002M执行卡住解决

    正常情况下,不到一分钟即可执行完ZPP002M节点 异常情况下,超过十分钟都没有响应 再等待只会影响FP的执行时间,影响后续的节点,解决办法是将正在执行的JOB STOP掉 再到服务器上将该节点重新执 ...

  6. [CSP-S模拟测试]:异或(数学)

    题目描述 给定$L,R$,我们希望你求出:$$\sum\limits_{i=L}^R\sum\limits_{j=L}^R(i\oplus j)$$其中这里的$\oplus$表示异或运算.答案对$10 ...

  7. Vue v-if以及 v-else 的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. git回滚操作

    一,找到之前的版本历史纪录,确定要回滚到那个版本号:git log 二,回滚到这个版本:git reset --hard 72229f823c8b21cbe52142a944d74f1883fa41a ...

  9. webpack配置之webpack.config.js文件配置

    webpack配置之webpack.config.js文件配置 webpack.config.js webpack resolve  1.总是手动的输入webpack的输入输出文件路径,是一件非常繁琐 ...

  10. 设计模式(4): 给组件实现单独的store

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 组件自身的store 我们在开发组件的时候,时常都有这种需求,就是希望 ...