洛谷P4155 BZOJP4444 [SCOI2015]国旗计划
自己做出来的第一道倍增(fake)
原题链接
看到题目,贪心水题!不仅思维难度低,代码也好(难)写,三下五除二就写了出来,过了样例。但是一交,只有40pts。一道紫题能让我快速水40pts,良心出题人啊>ω<!
然后我们考虑如何优化这个贪心:
首先我们发现,对于每一个人,在贪心的思路下,他的下一个最优的接替者都是一定的。这表明我们之前\(O(n^2)\)的贪心中,有很多步骤都是不必要的,如果我们能记录一下从某个人开始,经过几轮交替后的接替者是谁就好了。
于是我们令\(f[i][j]\)表示从第\(i\)个人开始,经过\(j\)次交替后的接替者,但很尴尬的是,这样会爆空间,时间复杂度貌似也不好。然后我们想到了倍增:
令\(f[i][j]\)表示从第\(i\)个人开始,经过\(2^j\)次交替后的接替者,\(f[i][j]\)可以从\(f[f[i][j-1]][j-1]\)转移过来,查询的时候我们就像倍增求\(LCA\)一样,从大到小往上跳,直到当前接替者的奔袭区间的右端点距离\(i\)的左端点不小于\(m\)就行了。
还有一个要注意的地方,我们在预处理\(f[i][0]\)时,不能用\(O(n)\)扫一遍。考虑一种极端情况:所有奔袭区间都为定长\(m-1\),且左端点依次相差\(1\),如果我们还扫一遍的话就会被卡回\(O(n^2)\)了。因为奔袭区间没有互相包含,所以左端点不超过当前区间右端点,且离当前区间右端点最近的区间一定是下一个最优选择,我们二分一下左端点就行了。
上代码(倍增题的预处理都巨长,是我写丑了嘛):
#include <cstdio>
#include <algorithm>
using namespace std;
#define N (int)2e5
#define re register
#define il inline
int n, m, l, r, ans[N+5], f[4*N+5][22], power[30]; //注意断环为链
struct Seg {
int id, l, r;
friend bool operator < (const Seg &lhs, const Seg &rhs) {
return lhs.l < rhs.l;
}
}seg[4*N+5];
il int read() {
int s = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
return s;
}
il void write(int x) {
if(x > 9) write(x/10);
putchar(x%10+'0');
}
il void init() {
n = read(), m = read();
power[0] = 1;
for(re int i = 1; i <= n; ++i) power[i] = (power[i-1]<<1); //预处理2的次幂
for(re int i = 1; i <= n; ++i) {
seg[i].id = seg[i+n].id = i;
seg[i].l = read(), seg[i].r = read();
if(seg[i].l > seg[i].r) seg[i].r += m;
seg[i+n].l = seg[i].l+m, seg[i+n].r = seg[i].r+m;
}
sort(seg+1, seg+2*n+1);
for(re int i = 1, l, r, mid; i <= n; ++i) {
l = i+1, r = 2*n;
while(l != r) { //二分左端点
mid = (l+r)/2;
if(seg[mid].l > seg[i].r) r = mid;
else l = mid+1;
}
f[i][0] = l-1, f[i+n][0] = l-1+n; //初值
}
for(re int j = 1; power[j] <= n; ++j)
for(re int i = 1; i <= n; ++i)
f[i][j] = f[f[i][j-1]][j-1], f[i+n][j] = f[i][j]+n; //递推f数组
}
int main() {
init();
for(re int i = 1, cnt, lim, u; i <= n; ++i) {
cnt = 1, lim = seg[i].l+m, u = i;
for(re int j = 20; j >= 0; --j)
if(seg[f[u][j]].id && seg[f[u][j]].r < lim) cnt += power[j], u = f[u][j];
ans[seg[i].id] = cnt+1;
}
for(re int i = 1; i <= n-1; ++i) write(ans[i]), putchar(' ');
write(ans[n]);
return 0;
}
洛谷P4155 BZOJP4444 [SCOI2015]国旗计划的更多相关文章
- [luogu] P4155 [SCOI2015]国旗计划(贪心)
P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
- 4444: [Scoi2015]国旗计划
4444: [Scoi2015]国旗计划 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 485 Solved: 232 Description A国 ...
- [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...
- 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...
- [bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划
Description \(A\) 国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 ...
- [洛谷OJ] P1114 “非常男女”计划
洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太 ...
- BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解
标题很长emmm…… [USACO2008 NOV]toy 玩具 https://www.luogu.org/problemnew/show/P2917 https://www.lydsy.com/J ...
随机推荐
- QT使用websocket进行长连接
一般我们用的最多的就是http请求,但是频繁的请求可能对服务造成的压力很大,所以今天谈谈websocket长连接,一句话:简单 1.什么是长连接? A:一次请求连接,终身使用,就可以长久的保持信息的交 ...
- DedeCMS清空删除所有文档后新建文档信息ID从1开始
方法一.登录织梦后台,找到系统->系统设置->SQL命令行工具 分别运行以下命令: 清除表中的数据,删除所有文章: truncate table `dede_arctiny`; trunc ...
- FFmpeg AVPacket相关主要函数介绍
1.AVPacket相关函数介绍 操作AVPacket的函数大约有30个,主要分为:AVPacket的创建初始化,AVPacket中的data数据管理(clone,free,copy),AVPacke ...
- mssql 存储过程调用另一个存储过程中的结果的方法分享
转自:http://www.maomao365.com/?p=6801 摘要: 下文将分享"一个存储过程"中如何调用"另一个存储过程的返回结果",并应用到自身的 ...
- angualr跨域访问配置
浏览器对于javascript的同源策略的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了: 简单的解释就是相同域名,端口相同,协议 ...
- 【转载】关于generate用法的总结【Verilog】
原文链接: [原创]关于generate用法的总结[Verilog] - nanoty - 博客园http://www.cnblogs.com/nanoty/archive/2012/11/13/27 ...
- python3 set(集合)
add(增加元素) name = set(['Tom','Lucy','Ben']) name.add('Juny') print(name) #输出:{'Lucy', 'Juny', 'Ben', ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- CentOS 7 中使用NTP进行时间同步
1. NTP时钟同步方式说明NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服 ...
- 利用XShell上传、下载文件(使用sz与rz命令)
XSHELL工具上传文件到Linux以及下载文件到本地(Windows) Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz.首先你 ...