Description

传送门

Solution

说真的这道题在场上没做出来的我必定是脑子有洞。。

我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置。

由于边境线是一圈,我们把把它当成链并复制一遍,操作的时候注意判断是否覆盖了一圈就好。

PS:边防站是点,它所谓覆盖边境线,是指每一个区间都要有士兵跑。如下图,这可不是每个点有士兵就算了的。

比如说一个士兵在1或3,一个在4或5,看起来非常没有毛病,然而3-4的区间没有人,就不算覆盖了啊啊啊。(不过怕是只有我这种脑袋缺点什么的人才会把它理解成覆盖点吧。。)

1     2     3     4     5

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,l,r,st[][],bin[],ans[];
struct node{int l,r,id;
}a[];int cnt=;
bool cmp(node a,node b){return a.l<b.l;}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d%d",&l,&r);
if (l>r) {a[i*-]=node{l,r+m,i};a[i*]=node{l+m,r+*m,};}
else {a[i*-]=node{l,r,i};a[i*]=node{l+m,r+m,};}
}
sort(a+,a+*n+,cmp); int now=;
for (int i=;i<=*n;i++)
{
while (a[now+].l<=a[i].r&&now<*n) now++;
st[i][]=now;
}
bin[]=;
for (int i=;i<=;i++) bin[i]=bin[i-]<<;
for (int j=;j<=;j++)
for (int i=;i<=*n-bin[j]+;i++)
st[i][j]=st[st[i][j-]][j-]; int tp,cnt;
for (int i=;i<=*n;i++)
if (a[i].id)
{
tp=a[i].l+m;
now=i;cnt=;
for (int j=;j>=;j--)
if (st[now][j]){
if (a[st[now][j]].r<tp) now=st[now][j],cnt+=bin[j];
}
ans[a[i].id]=cnt;
}
for (int i=;i<=n;i++) printf("%d ",ans[i]); }

[BZOJ4444][SCOI2015]国旗计划-[ST表]的更多相关文章

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

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

  2. BZOJ4444 : [Scoi2015]国旗计划

    首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...

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

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

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

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

  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. D3——scale

    d3.scale 比例尺 “Scales are functions that map from an input domain to an output range” Domains 定义域 和 R ...

  2. Mysql不带条件更新报错

    执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式即可: 恢复安全模式:SET SQL_SAFE_UPDATES = 1;

  3. BZOJ1369:[Baltic2003]Gem(树形DP)

    Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小. Input 先给出一个 ...

  4. 【[SDOI2008]Sandy的卡片】

    被\(mhr\)的暴力干翻了 这道题做法还是非常好想的 先做一遍差分,在每个串的某尾插入一个特殊字符,再将所有的串拼接在一起 现在的问题就转化为找到一个最长的公共子串使得其出现了\(n\)次,但是在一 ...

  5. python反序列化

    import pickle import os class A(object): def __reduce__(self): a = """python -c 'impo ...

  6. css注入获取网页中的数据

    <style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br>< ...

  7. 2、Android-UI(关于Nine-Patch图片)

    实例: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  8. DMA(Direct Memory Access)简介

    什么是DMA(Direct Memory Access) DMA绕过CPU,在内存和外设之间开辟了一条 "隧道" ,直接控制内存与外设之间的操作,并完全由硬件控制. 这样数据传送不 ...

  9. nRF5 SDK for Mesh(五) Light switch demo 点灯例子

    Light switch demo  灯开demo   Purpose This demo project consists of four sub examples - The light swit ...

  10. Java解析Excel之应用Reflection等技术实现动态读取

    目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...