Description:

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

A 国幅员辽阔,边境线上设有 \(M\) 个边防站,顺时针编号 \(1\) 至 \(M\)。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。\(N\) 名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。

现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。

Hint:

\(n\le 10^5,m\le 10^9\)

Solution:

先破环为链,因为区间不互相包含

所以我们每次对一个区间暴力跳最右边的左端点小于该区间右端点的那个区间

然后考虑用倍增优化这个跳的过程,就完了

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=5e5+5;
int n,m,cnt,tot,hd[mxn],ans[mxn];
int f[mxn][25]; struct T {
int l,r,id;
friend bool operator < (T x,T y) {
return x.l<y.l;
}
}a[mxn]; inline int read() {
char c=getchar(); int x=0,f=1;
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
return x*f;
}
inline void chkmax(int &x,int y) {if(x<y) x=y;}
inline void chkmin(int &x,int y) {if(x>y) x=y;} struct ed {
int to,nxt;
}t[mxn<<1]; inline void add(int u,int v) {
t[++cnt]=(ed) {v,hd[u]}; hd[u]=cnt;
} int solve(int x) {
int des=a[x].l+m,res=0;
for(int i=20;i>=0;--i)
if(f[x][i]&&a[f[x][i]].r<des)
x=f[x][i],res+=(1<<i);
return res+2; //加上起始区间和结束区间
} int main()
{
tot=n=read(); m=read();
for(int i=1;i<=n;++i) {
a[i].l=read(); a[i].r=read(); a[i].id=i;
if(a[i].l>a[i].r) a[i].r+=m;
else a[++tot]=(T) {a[i].l+m,a[i].r+m,i};
//破环为链,转化为单方向上的序列问题
}
sort(a+1,a+tot+1); a[tot+1].r=2e9; int pos=1;
for(int i=1;i<=tot;++i) {
while(pos<=tot&&a[pos+1].l<=a[i].r) ++pos;
f[i][0]=pos;
}
for(int j=1;j<=20;++j)
for(int i=1;i<=tot;++i)
f[i][j]=f[f[i][j-1]][j-1];
for(int i=1;i<=tot;++i)
if(a[i].l<=m) ans[a[i].id]=solve(i);
for(int i=1;i<=n;++i) printf("%d ",ans[i]);
return 0;
}

最新文章

  1. LeetCode—— Median of Two Sorted Arrays
  2. 【温故而知新-Javascript】时间效果(显示当前时间、显示当前日期、显示页面停留时间、倒计时)
  3. LR_问题_运行场景时提示scripts you are running in invalid
  4. E6全部刷机包
  5. Win7/Win8右键菜单管理工具(Easy Context Menu) v1.5 绿色版
  6. css弹性盒子新旧兼容
  7. 【干货】分享几个写 demo 的思路
  8. 手把手学会MySql主从配置
  9. Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
  10. quartz一次简单应用经历
  11. docker 清理容器的命令
  12. Lucene.Net简介
  13. poj 3083 Children of th
  14. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
  15. cocos代码研究(6)有限时间动作类(FiniteTimeAction)学习笔记
  16. unusedjs
  17. 四种传值方法(通知、block、属性、NSUserDefaults)
  18. H5页面遮罩弹框下层还能滚动的问题
  19. yum-plugin-priroites这个插件的一个文件。
  20. HTML5 SSE 数据推送应用开发

热门文章

  1. P1972 [SDOI2009]HH的项链
  2. Linux基础系统优化及常用命令
  3. orcle数据库表中字段值含有单引号,如何模糊搜索?
  4. 423 重温Java Script and jQuery 葵花宝典 Bootstrap
  5. Could not find a package configuration file provided by &quot;Qt5Widgets&quot;
  6. 2018-2019-2 20165237《网络对抗技术》Exp2 后门原理与实践
  7. 第一章Java学习(查漏补缺)
  8. hihocoder 1175
  9. ELK全Dokcer 部署
  10. MySQL数据优化