「WC2018即时战略」

题目描述

小 M 在玩一个即时战略 (Real Time Strategy) 游戏。不同于大多数同类游戏,这个游戏的地图是树形的。也就是说,地图可以用一个由 \(n\) 个结点,\(n - 1\) 条边构成的连通图来表示。这些结点被编号为 \(1 \sim n\)。

每个结点有两种可能的状态:“已知的”或“未知的”。游戏开始时,只有 \(1\) 号结点是已知的。

在游戏的过程中,小 M 可以尝试探索更多的结点。具体来说,小 M 每次操作时需要选择一个已知的结点 \(x\),和一个不同于 \(x\) 的任意结点 \(y\)(结点 \(y\) 可以是未知的)。然后游戏的自动寻路系统会给出 \(x\) 到 \(y\) 的最短路径上的第二个结点 \(z\),也就是从 \(x\) 走到 \(y\) 的最短路径上与 \(x\) 相邻的结点。此时,如果结点 \(z\) 是未知的,小 M 会将它标记为已知的。

这个游戏的目标是:利用至多 \(T\) 次探索操作,让所有结点的状态都成为已知的。然而小 M 还是这个游戏的新手,她希望得到你的帮助。

解题思路 :

首先有一个比较直观的暴力,random_shuffle一个询问顺序,同时维护一棵“已知树”。

每次从根节点开始询问,回答要么是当前点的儿子,要么是一个未知节点,如果是当前点的儿子就进入儿子节点,否则就把未知节点添加进树。

这样子做复杂度和询问次数都是 \(O(n^2)\),加上一条链的暴力可以得到 \(65\) 分。

实际上每次如果是已知节点的话,只需要进入儿子对应的子树询问即可,所以很容易想到用点分树维护这个“已知树”,每次直接找到这个儿子对应的点分中心进行询问,树高变成 \(logn\) 。

但是加点操作会破坏点分树的性质,使得树高会大于 \(logn\) 以至于退化到平方级别的复杂度,在这里可以用替罪羊树的思想,每次加完点后暴力向上检查子树的平衡性暴力重构,\(\alpha\) 这里一般设 \(0.7\) 。

不过由于我维护点分树信息的时候用 \(map\) 存了每个儿子对应的点分中心是什么,所以我的复杂度是 $O(nlog^2n) $ ,有点卡常数,不保证所有地方都能过。

  1. #include "rts.h"
  2. /*program by mangoyang*/
  3. #include<bits/stdc++.h>
  4. #define inf (0x7f7f7f7f)
  5. #define Max(a, b) ((a) > (b) ? (a) : (b))
  6. #define Min(a, b) ((a) < (b) ? (a) : (b))
  7. typedef long long ll;
  8. using namespace std;
  9. const int N = 1000005;
  10. map<int, int> mp[N], ss[N];
  11. int vis[N], vi[N], sz[N], in[N], cc[N], mx[N], fa[N];
  12. int size[N], id[N], ps[N], all, mn, rt, Root = 1;
  13. map<int, int>::iterator it;
  14. namespace Line{
  15. int s[2] = {1, 1};
  16. inline void solve(int n){
  17. for(int i = 1, x; i < n; i++){
  18. int now = id[i], tw = 1;
  19. while(!vis[now]){
  20. x = explore(s[tw], now);
  21. if(vis[x]) x = explore(s[tw^=1], now);
  22. vis[x] = 1, s[tw] = x;
  23. }
  24. }
  25. }
  26. }
  27. inline void cleartag(int u){
  28. in[u] = 1;
  29. for(map<int,int>::iterator it = mp[u].begin(); it != mp[u].end(); it++)
  30. if(it->second) cleartag(it->second);
  31. }
  32. inline void getsize(int u, int ff){
  33. int now = 0; sz[u] = 1;
  34. for(map<int, int>::iterator it = mp[u].begin(); it != mp[u].end(); it++){
  35. int v = it->first;
  36. if(v == ff || !in[v]) continue;
  37. getsize(v, u), sz[u] += sz[v];
  38. if(sz[v] >= now) now = sz[v];
  39. }
  40. now = max(now, all - sz[u]);
  41. if(now <= mn) mn = now, rt = u;
  42. }
  43. inline void rebuild(int u){
  44. int last = all; in[u] = 0;
  45. for(map<int, int>::iterator it = mp[u].begin(); it != mp[u].end(); it++){
  46. int v = it->first;
  47. if(!in[v]) continue;
  48. mn = all = sz[v] >= sz[u] ? last - sz[u] : sz[v];
  49. getsize(v, u);
  50. size[rt] = all, fa[rt] = u, mx[u] = Max(mx[u], all);
  51. mp[u][v] = rt, ss[u][rt] = v, mp[v][u] = 0, rebuild(rt);
  52. }
  53. }
  54. inline void update(int u){
  55. int ned = 0;
  56. for(int x = u; x != Root; x = fa[x]){
  57. size[fa[x]]++;
  58. if(size[x] > mx[fa[x]]) mx[fa[x]] = size[x];
  59. if(mx[fa[x]] >= size[fa[x]] * 0.735) ned = fa[x];
  60. }
  61. if(!ned) return;
  62. if(ned){
  63. cleartag(ned);
  64. all = mn = size[ned], getsize(ned, fa[ned]);
  65. if(ned == Root) Root = rt;
  66. size[rt] = all, fa[rt] = fa[ned];
  67. int k = ss[fa[rt]][ned];
  68. ss[fa[rt]][rt] = k, mp[fa[rt]][k] = rt, rebuild(rt);
  69. }
  70. }
  71. inline void addnode(int pos){
  72. for(register int u = Root; ; ){
  73. int x = explore(u, pos);
  74. if(!vis[x]){
  75. fa[x] = u, size[x] = vis[x] = 1;
  76. mp[u][x] = ss[u][x] = x, mp[x][u] = 0, update(x);
  77. break;
  78. } u = mp[u][x];
  79. }
  80. }
  81. void play(int n, int T, int datatype){
  82. srand(19262333);
  83. for(int i = 1; i < n; i++) id[i] = i + 1;
  84. random_shuffle(id + 1, id + n), vis[1] = 1;
  85. if(datatype == 3) return (void) (Line::solve(n));
  86. for(int i = 1; i < n; i++) while(!vis[id[i]]) addnode(id[i]);
  87. }

「WC2018即时战略」的更多相关文章

  1. [WC2018]即时战略——动态点分治(替罪羊式点分树)

    题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...

  2. WC2018 即时战略

    交互题 一棵树,一开始只有 1 号点是已知的,其他的都是未知的,你可以调用函数 explore(x,y) ,其中 x 必须是已知的,函数会找到 x 到 y 路径上第二个点,并把它标成已知,求最小步数使 ...

  3. 【UOJ#349】[WC2018] 即时战略

    题目链接 题意 一开始已知一号点. 每次可以选定一个已知点和一个未知点,然后交互库会返回从已知点出发到达未知点路径上的第二个点. 要求在有限步之内知道每一个点. 次数要求: 链的情况要求 \(O(n) ...

  4. [WC2018]即时战略(LCT,splay上二分)

    [UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...

  5. 「WC2018」即时战略

    「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...

  6. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  7. 【WC2018】即时战略(动态点分治,替罪羊树)

    [WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...

  8. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  9. 【WC2018】即时战略

    题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...

随机推荐

  1. Stat1—浅谈协方差矩阵

    今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~本文我将用自认为循序渐进的方式谈谈协方差 ...

  2. python学习笔记(十三)之lambda表达式

    lambda表达式: 用法 lambda x : 2 * x + 1 其中:前面是参数,后面是返回值. >>> def ds(x): ... return 2 * x + 1 ... ...

  3. 【洛谷 P4016】 负载平衡问题(费用流)

    题目链接 环形均分纸牌,既然是网络流23题的那就用网络流做把. 套路拆点. 供需平衡. 源点向大于平均数的点的入点连流量为这个数减去平均数的差,费用为0的边,表示需要移走这么多. 小于平均数的点的出点 ...

  4. docker ubuntu容器更换阿里源(转)

    问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...

  5. bootstrap通过ajax请求JSON数据后填充到模态框

    1.   JSP页面中准备模态框 <!-- 详细信息模态框(Modal) --> <div> <div class="modal fade" id=& ...

  6. 首次成功的web渗透

    web渗透 今天给大家讲一个最近做的一件令我振奋的一件事情 渗透培训刚刚结束的第二天 我在公网上挖到了我人生中的第一个站 总体来说个人真的很振奋人心      这个网站还没有进行更改但我已经通知了他们 ...

  7. mac 上使用octave的plot错误的解决办法

    在mac10.10上使用octave的时候,键入 plot(x, y)的时候会出现如下错误: ^ line : unknown or ambiguous terminal type; type jus ...

  8. u-boot中的Makefile

    在windos下,pc机上电之后,BIOS会初始化硬件配置,为内核传递参数,引导操作系统启动,并且识别C盘.D盘.等整个操作系统启动起来之后,才可以运行应用程序比如QQ.QQ音影.同理,在嵌入式Lin ...

  9. 使用extjs做的一个简单grid

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  10. ifconfig与内核通信 ifreq 结构体分析和使用

    结构原型: /* * Interface request structure used for socket * ioctl's.  All interface ioctl's must have p ...