自己做出来的第一道倍增(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)\)了。因为奔袭区间没有互相包含,所以左端点不超过当前区间右端点,且离当前区间右端点最近的区间一定是下一个最优选择,我们二分一下左端点就行了。

上代码(倍增题的预处理都巨长,是我写丑了嘛):

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. #define N (int)2e5
  5. #define re register
  6. #define il inline
  7. int n, m, l, r, ans[N+5], f[4*N+5][22], power[30]; //注意断环为链
  8. struct Seg {
  9. int id, l, r;
  10. friend bool operator < (const Seg &lhs, const Seg &rhs) {
  11. return lhs.l < rhs.l;
  12. }
  13. }seg[4*N+5];
  14. il int read() {
  15. int s = 0;
  16. char c = getchar();
  17. while(c < '0' || c > '9') c = getchar();
  18. while(c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
  19. return s;
  20. }
  21. il void write(int x) {
  22. if(x > 9) write(x/10);
  23. putchar(x%10+'0');
  24. }
  25. il void init() {
  26. n = read(), m = read();
  27. power[0] = 1;
  28. for(re int i = 1; i <= n; ++i) power[i] = (power[i-1]<<1); //预处理2的次幂
  29. for(re int i = 1; i <= n; ++i) {
  30. seg[i].id = seg[i+n].id = i;
  31. seg[i].l = read(), seg[i].r = read();
  32. if(seg[i].l > seg[i].r) seg[i].r += m;
  33. seg[i+n].l = seg[i].l+m, seg[i+n].r = seg[i].r+m;
  34. }
  35. sort(seg+1, seg+2*n+1);
  36. for(re int i = 1, l, r, mid; i <= n; ++i) {
  37. l = i+1, r = 2*n;
  38. while(l != r) { //二分左端点
  39. mid = (l+r)/2;
  40. if(seg[mid].l > seg[i].r) r = mid;
  41. else l = mid+1;
  42. }
  43. f[i][0] = l-1, f[i+n][0] = l-1+n; //初值
  44. }
  45. for(re int j = 1; power[j] <= n; ++j)
  46. for(re int i = 1; i <= n; ++i)
  47. f[i][j] = f[f[i][j-1]][j-1], f[i+n][j] = f[i][j]+n; //递推f数组
  48. }
  49. int main() {
  50. init();
  51. for(re int i = 1, cnt, lim, u; i <= n; ++i) {
  52. cnt = 1, lim = seg[i].l+m, u = i;
  53. for(re int j = 20; j >= 0; --j)
  54. if(seg[f[u][j]].id && seg[f[u][j]].r < lim) cnt += power[j], u = f[u][j];
  55. ans[seg[i].id] = cnt+1;
  56. }
  57. for(re int i = 1; i <= n-1; ++i) write(ans[i]), putchar(' ');
  58. write(ans[n]);
  59. return 0;
  60. }

洛谷P4155 BZOJP4444 [SCOI2015]国旗计划的更多相关文章

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

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

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

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

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

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

  4. 4444: [Scoi2015]国旗计划

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

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

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

  6. 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)

    洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...

  7. [bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划

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

  8. [洛谷OJ] P1114 “非常男女”计划

    洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太 ...

  9. BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解

    标题很长emmm…… [USACO2008 NOV]toy 玩具 https://www.luogu.org/problemnew/show/P2917 https://www.lydsy.com/J ...

随机推荐

  1. IPD体系向敏捷开发模式转型实施成功的四个关键因素

    文/杨学明  集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Development)是当前国内外企业产品研发管理的最常用的3种模式.随着创新环境的快速发展,许多企业都会 ...

  2. Elasticsearch源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...

  3. GDB 显示别的文件;在别文件打断点;执行到函数末尾;跳出当前函数

    显示别的文件:l "文件名.后缀名":行号 在别文件打断点:b "文件名.后缀名":行号 执行到函数末尾:finish 跳出当前函数(当前位置到函数的末尾不被执 ...

  4. python中创建虚拟环境

    # virtualenv 虚拟环境安装 pip install virtualenv # 创建虚拟环境        virtualenv [虚拟环境名称] # 进入虚拟环境 windows : 进入 ...

  5. LVS+Keepalived实现mysql的负载均衡

    1 初识LVS:Linux Virtual Server 1.1 LVS是什么       LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起 ...

  6. Windows Service 学习系列(三)——循环引擎 ICycleEngine

    摘要:转载:https://www.cnblogs.com/zhuweisky/archive/2009/09/01/1557792.html#undefined 1.缘起: 有些系统需要每隔一段时间 ...

  7. threejs学习笔记(二)

    THREE.WebGLRenderer THREE.Scene THREE.OrthographicCamera正交相机 THREE.PerspectiveCamera透视相机 renderer.se ...

  8. Linux 进入 5.0 时代!

    Linux 进入 5.0 时代! 为什么 Linux 4.2 之后的版本不再是 4.21 而是 5.0? 如果你非要一个理由,那就是因为 Linux 4.x 的版本如今用手指与脚趾加在一起都要数不过来 ...

  9. centos7下kubernetes(13。kubernetes-探讨service IP)

    service cluster IP是一个虚拟IP,是由kubernetes节点上的iptables规则管理的 通过iptables-save | grep 10.105.215.156看到与clus ...

  10. 监控glusterfs

    监控集群状态 [4ajr@elk1 scripts]$ cat glusterfs_peer_status.sh #!/bin/bash peer_status=`sudo gluster peer ...