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号边防战士必须参加的前提下至少需要多少名边防战士才能顺利地完成国旗计划.

HINT

$n\leq 2\times 10^5,M<10^9,1\leq C_i,D_i\leq M$

题解:

一个环的题容易想到倍长变成链,然后对于点$i$向右跑到了点$i+m$就算跑完了;

考虑算出每个点向右一次能传递到的最右端的节点,设为$next[i]$,将所有人按照左端点排序,找到左端点不超过当前节点的右端点最大的即可;由于排序后左节点单调上升,所以找到的人也肯定单调向右,所以可以直接用一个指针扫,线性复杂度计算;

然后一个显然的做法是倍增,用类似树上倍增的方法维护每个$i$到$next[i]$的这个类似树的结构,然后直接跑就行了。

但是由于本人过于傻逼,以为倍增完还要二分找答案,算了算40w两个$log$正好1.2S,然后不知道谁说这题一秒时限肯定会卡我(实际上这题后来改成了两秒并且倍增只有一个$log$),于是自爆的cha掉了这个算法。。。

进一步看这棵next树,设当前节点为$x$,$next[x]$能走到的最远节点为$k$,那么显然$next[x]$和$k$之间的距离至少为$m$,所以$x$到$k$的距离一定大于$m$,所以$x$能走到的最远节点$k'$一定在$next[x]$和$k$之间,如图:

这个性质就是说,每次做出的决策点肯定不会比上一次(父节点)的决策点更右,即深度是保持不降的,那么就可以用双端队列暴力维护进出队,统计答案就是$dep[x]-dep[k]+1$。

后面的部分只需要一个dfs,所以时间复杂度是线性的,但是前面要排序,所以是$O(nlogn)$。。。

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
struct edge{
int v,next;
}a[];
struct task{
ll l,r;
int id;
}q[];
int n,m,p=,tot=,dep[],ans[],head[],hd,ta,qq[];
ll l,r;
bool cmp(task a,task b){
return a.l<b.l;
}
void add(int u,int v){
a[++tot].v=v;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int now,int dpt){
dep[u]=dpt;
qq[++ta]=u;
if(q[u].id){
while(now<ta&&q[qq[now+]].r>=q[u].l+m)now++;
ans[q[u].id]=dep[u]-dep[qq[now]]+;
}
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
dfs(v,now,dpt+);
}
ta--;
}
int main(){
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d%d",&l,&r);
if(l>r)r+=m;
q[i].l=l;
q[i].r=r;
q[i].id=i;
q[i+n].l=l+m;
q[i+n].r=r+m;
q[i+n].id=;
}
sort(q+,q+n+,cmp);
for(int i=;i<n*;i++){
while(p<n*&&q[p+].l<=q[i].r)p++;
add(p,i);
}
dfs(n*,,);
for(int i=;i<=n;i++)printf("%d ",ans[i]);
return ;
}

【BZOJ4444】国旗计划 - 决策单调性的更多相关文章

  1. [bzoj4444] 国旗计划 双指针+倍增

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

  2. bzoj4444 国旗计划

    题目链接 倍增,预处理出每个点往后$2^i$个应该选哪个人 我用的treap就是快 #include<algorithm> #include<iostream> #includ ...

  3. luogu4155/bzoj4444 国旗计划 (倍增)

    成环,把每个区间变成两个然后展开成链 一个人的下一个人肯定是在彼此相交的基础上,右端点越大越好 于是就把它连到相交的.右端点最大的点上,连成一棵树 于是每次只要从某个节点开始,一直在树上跳到覆盖了一个 ...

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

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

  5. 【bzoj4444 scoi2015】国旗计划

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

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

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

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

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

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

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

  9. 国旗计划(flag)

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

随机推荐

  1. Type system-Type checking

    类型系统的属性: 1.结构属性: 2.规则属性:类型系统定义了一套规则(内部数据的访问规则.函数的访问规则.类型的比较与转化规则),以供编译和运行时进行检查. In programming langu ...

  2. jquery的animate能渐变background-color

    在freecodecamp 上学习复习时,写了一个demo,引用了 jquery 实现 color 的渐变动画,然后运行测试的时候,发现其他功能都正常,就是无法是实现颜色的动画. 如: $('butt ...

  3. CorelDRAW简单绘制的一杯满满的橙汁教程

    CorelDRAW怎么画一杯橙汁?方法很简单,首先绘制一个闭合路径,执行线性渐变,填充颜色:复制图形,使用刻刀工具裁剪两半,更改不透明度:然后为橙汁增加底部椭圆:修剪橙子片:绘制吸管:最后加上一层橙子 ...

  4. vue 页面跳转及参数传递和接收

    跳转: this.$router.push({name: 'My',params:{ id:'1',name:'anson'}});   接收: {{this.$route.params.id}}

  5. LAMP 环境搭建备忘 -- Linux的安装(一)

    LAMP指的是 Linux + Apatch + MySQL / MariaDB + PHP/Perl/Python 一套搭建网站服务器的开源软件组合.工作原理图如下: 下面开始环境搭建 1 Linu ...

  6. Uboot优美代码赏析1:目录结构和malkefile分析

    Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...

  7. Linux 操作系统启动流程

    1.加载bios bios中包含的硬件CPU 内存 硬盘等相关信息 2.读取MBR 读取完bios信息之后,计算机会查找bios制定的硬盘MBR引导扇区,将其内容复制到 0x7c00 地址所在的物理内 ...

  8. KMP算法题集

    模板 caioj 1177 KMP模板 #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = (a); i & ...

  9. sql删除注意的问题

    老大骂你都是有原因的,基础要打好!!!! SQL关于删除的三个语句:DROP.TRUNCATE. DELETE 的区别. DROP test; 删除表test,并释放空间,将test表删除的一干二净 ...

  10. Mysql怎么样避免全表扫描,sql查询优化

    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: 尝试下面的技巧以避免优化器错选了表扫描: 使用ANALYZE TABLE tbl_name为扫 ...