题目描述

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】国旗计划的更多相关文章

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

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

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

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

  3. BZOJ4444 : [Scoi2015]国旗计划

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

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

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

  5. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

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

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

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

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

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

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

  9. 4444: [Scoi2015]国旗计划

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

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

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

随机推荐

  1. 如何解决python中使用flask时遇到的markupsafe._compat包缺失的问题

    在使用python进行GUI的程序编写时,使用flask时出现错误: 在使用pip freeze进行查看已下载的包时显示MarkupSafe与Jinjia2都已安装: 在网上查阅一些资料后发现,在py ...

  2. beat冲刺计划安排

    1. 团队成员 组长:郭晓迪 组员:钟平辉 柳政宇 徐航 曾瑞 2. 主要计划安排如下: 3. 详细日程任务安排

  3. Flask 学习 七 用户认证

    使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...

  4. 一个毕生难忘的BUG

    记得以前接手过一个Java项目,服务器程序,直接让Jar在linux上跑的那种, 这个项目由两个web服务组成,也就是两条Java进程,主进程 xxx.jar,辅助进程 xxx_helper.jar. ...

  5. DBA 小记 — 分库分表、主从、读写分离

    前言 我在上篇博客 "Spring Boot 的实践与思考" 中比对不同规范的 ORM 框架应用场景的时候提到过主从与读写分离,本篇随笔将针对此和分库分表进行更深入地探讨. 1. ...

  6. 职场选择之大公司 VS 小公司

    其实这是个非常难回答的问题,很多职场新人都会有类似的顾虑和疑问. 这个问题就好比业界比较容易引起争议的编程语言哪个是最好的一样.大公司还是小公司里面发展,只有身处其中才能体会,如人饮水,冷暖自知. 笔 ...

  7. LeetCode & Q1-Two Sum-Easy

    Array Hash Table Question Given an array of integers, return indices of the two numbers such that th ...

  8. MySQL一些中重要命令

    前言: 最近在面试的过程中,深感对MySQL一些重要命令的缺失.借着这个机会,补补这块的知识.不让自己只会增删查改,懂一些高级的东西 limit 用法 order by 用法 in 和 between ...

  9. Apache虚拟主机实战

    [root@localhost ~]# wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.2.32.tar.bz2  [root@localho ...

  10. 阿里安全归零实验室招聘各路大牛!offer好说!

    阿里安全归零实验室成立于2017年11月,致力于对黑灰产技术的研究.实验室的愿景是通过技术手段解决当前日益严重的网络违规和网络犯罪问题,为阿里新经济体保驾护航. 实验室与寄生在阿里生态经济体的黑灰产直 ...