题解

考虑朴素的做法,断环为链,复制2M个,找到一个位置i,f(i)是这个位置之前开始的线段,结束位置最远的位置在哪

然后对于每一个人,从自己线段的起点往下跳,跳到起点+M或以后的步数就是答案

我们发现这其实是最后一个点为根构建成的一棵树,很显然的,我们答案只可能是最少的用人数量+1或最少的用人数量

我们遍历整个树,只对第一次遍历到的起点求值,然后剩下的只要特判一下那种情况就好,用一个栈记录一下根节点到它的路径

代码

#include <bits/stdc++.h>
#define MAXN 200005
//#define ivorysi
#define enter putchar('\n')
#define space putchar(' ')
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M,ans;
int num[MAXN * 4],tot,st[MAXN * 4],Cnt,sta[MAXN * 4],top,MK[MAXN],vis[MAXN * 4];
pii seg[MAXN * 2];
vector<int> son[MAXN * 4];
void dfs(int u) {
sta[++top] = u;
vis[u] = 1;
if(st[u]) {
if(!ans) {
for(int i = top - 1 ; i >= 1 ; --i) {
++ans;
if(num[sta[i]] >= num[u] + M) break;
}
MK[st[u]] = ans;
}
else {
if(top > (ans - 1) && num[sta[top - (ans - 1)]] >= num[u] + M) MK[st[u]] = ans - 1;
else if(top > ans && num[sta[top - ans]] >= num[u] + M) MK[st[u]] = ans;
else MK[st[u]] = ans + 1;
}
}
for(auto k : son[u]) {
dfs(k);
}
--top;
}
void Init() {
read(N);read(M);
Cnt = N;
for(int i = 1 ; i <= N ; ++i) {
read(seg[i].fi);read(seg[i].se);
if(seg[i].se < seg[i].fi) seg[i].se += M;
seg[++Cnt] = mp(seg[i].fi + M,seg[i].se + M);
}
for(int i = 1 ; i <= Cnt ; ++i) num[++tot] = seg[i].fi,num[++tot] = seg[i].se;
sort(num + 1,num + tot + 1);
tot = unique(num + 1,num + tot + 1) - num - 1;
for(int i = 1 ; i <= N ; ++i) {
int t = lower_bound(num + 1,num + tot + 1,seg[i].fi) - num;
st[t] = i;
}
sort(seg + 1,seg + Cnt + 1);
int maxx = 0,p = 1;
for(int i = 1 ; i <= tot ; ++i) {
while(p <= Cnt && seg[p].fi <= num[i]) {
maxx = max(maxx,(int)(lower_bound(num + 1,num + tot + 1,seg[p].se) - num));
++p;
}
if(maxx != i) son[maxx].pb(i);
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
for(int i = tot ; i >= 1 ; --i) {
if(!vis[i]) dfs(i);
}
for(int i = 1 ; i <= N ; ++i) {
out(MK[i]);if(i == N) enter;else space;
}
return 0;
}

【LOJ】#2007. 「SCOI2015」国旗计划的更多相关文章

  1. loj #2007. 「SCOI2015」国旗计划

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

  2. #2007. 「SCOI2015」国旗计划

    好久没更过博了.. 首先断环为链,因为线段互相不包含,所以对每个线段\(i\)可以找一个满足\(r_j\geq l_i\)的\(l_j\)最小的线段,dp的时候\(i\)就会从\(j\)转移过来 然后 ...

  3. AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

    #2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...

  4. 「SCOI2015」国旗计划 解题报告

    「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...

  5. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  6. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  7. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  8. loj#2552. 「CTSC2018」假面

    题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...

  9. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. Update submitted Perforce changelist description by P4.net api

    Firstly download the p4.net sdk from Perforce official site's download page. It's a .zip file, extra ...

  2. libevent学习文档(三)working with event

    Events have similar lifecycles. Once you call a Libevent function to set up an event and associate i ...

  3. 「Linux+Django」Django+CentOs7+uwsgi+nginx部署网站记录

    转自:http://www.usday.cn/blog/51 部署前的准备: 1. 在本地可以运行的django项目 2. 一台云服务器,这里选用Centos系统 开始部署: 首先在本地导出项目需要的 ...

  4. [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  5. [吴恩达机器学习笔记]12支持向量机3SVM大间距分类的数学解释

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.3 大间距分类背后的数学原理- Mathematic ...

  6. Java设计模式の迭代器模式

    迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...

  7. 哪些window你不知道的却实用的小技巧----window小技巧

    前言 一直想要整理一篇有关于window比较全的使用小技巧,却又不知道从哪里开始写起.而让我准备动手写这边随笔的动力,还是在加入虫部落<一个绿色环保,充满朝气的好地方>,从大家的分享中,我 ...

  8. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  9. Codeforces Round #191 (Div. 2) A. Flipping Game(简单)

    A. Flipping Game time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  10. 千里之行始于足下,node.js 资源中文导航

    响应@jiyinyiyong 号召,cnodjs 好的资源蛮多的,的确欠缺分类,在一群FAQ中,的确很容易沉下去,根据自己对node.js的理解,做成一个资源导航,PS:如果觉得合适,希望能够合并的c ...