【LOJ】#2007. 「SCOI2015」国旗计划
题解
考虑朴素的做法,断环为链,复制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」国旗计划的更多相关文章
- loj #2007. 「SCOI2015」国旗计划
#2007. 「SCOI2015」国旗计划 题目描述 A 国正在开展一项伟大的计划 —— 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成 ...
- #2007. 「SCOI2015」国旗计划
好久没更过博了.. 首先断环为链,因为线段互相不包含,所以对每个线段\(i\)可以找一个满足\(r_j\geq l_i\)的\(l_j\)最小的线段,dp的时候\(i\)就会从\(j\)转移过来 然后 ...
- AC日记——「SCOI2015」国旗计划 LiBreOJ 2007
#2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- loj #2008. 「SCOI2015」小凸想跑步
#2008. 「SCOI2015」小凸想跑步 题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- loj#2552. 「CTSC2018」假面
题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- mysql日志配置
mysql在错误排查,优化的时候会用到日志 有错误日志,查询日志,慢查询日志,二进制日志 先找到日志文件,linux 一般在/etc/my.cnf中 打开看到 log-error=/webserver ...
- 杨辉三角之c实现任意行输出
#include<stdio.h> #include<stdlib.h> int** fmalloc(int n){ int** array; //二维指针 int i; ar ...
- python 分享文件
http://note.youdao.com/noteshare?id=1787e8bf3a71fca16005ece3e7fffb6c
- 【题解】期末考试 六省联考 2017 洛谷 P3745 BZOJ 4868 贪心 三分
题目传送门:这里是萌萌哒传送门(>,<) 啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法. 思路很简单,假设我指定了一个x, ...
- Linux下UDP一发一收通信
实现在Linux环境下的UDP通信测试. 注释了while循环,将代码规范化. udpserver.c代码: /******************************************** ...
- jq的图片放大镜效果
<div class="imgbox"> <div class="probox"> <img src="" a ...
- 【整理】explain、type、extra用法和结果的含义
EXPLAIN列详情 详细解读:https://www.cnblogs.com/yycc/p/7338894.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以 ...
- nginx 初探 之反向代理
首先要解释的是什么叫做反向代理? 平时我们浏览网页可以输入网址直接访问, 但如果访问国外的网站, 可能就没那么简单('中国特色'), 这时候我们需要配置一个代理服务器, 然后通过此服务器中转来访 ...
- HDU 4990 Reading comprehension 简单矩阵快速幂
Problem Description Read the program below carefully then answer the question.#pragma comment(linker ...
- TreeSet的特性
TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式. 1.存储 ...