题意:

给一棵 $n$ 个节点的树,维护两种操作:

  1.将距离 $x$ $distance \leq d$ 的点染成 $c$

  2.询问 $x$ 的颜色。

解法:

首先将染色可以转换为每个时间对应一个颜色,问题转化为区间取 $max$

动态树分治,即可。

考虑朴素点分治中的每一个重心,将其管辖的所有点按照到重心的距离从大到小排序,然后用线段树维护。

修改时,从 $x$ 向上走,将每一个重心 $t$ 中 $dist<x,t> + dist<t,y>\leq d$ 的点修改。

查找时,从 $x$ 向上走,查询每一个重心中 $x$ 所对应的值,求 $max$ 即可。

$O(nlog^2n)$

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. #define p E[i].x
  8. #define N 100010
  9. #define M 7000010
  10. #define l(x) ch[x][0]
  11. #define r(x) ch[x][1]
  12. #define MP(x, y) make_pair(x, y)
  13. #define LL long long
  14.  
  15. using namespace std;
  16.  
  17. typedef pair<int,int> PII;
  18.  
  19. struct edge
  20. {
  21. int x, to, v;
  22. }E[N<<];
  23.  
  24. int totE, totn, n, m, hev, lef_now;
  25. int g[N], h[N], de[N], siz[N], root[N], fa[N][], col[N], d[N];
  26. int ch[M][], setv[M];
  27. vector<PII> nod[N], id[N];
  28. vector<int> hevs[N];
  29. int dis[N][];
  30. bool v[N];
  31.  
  32. void addedge(int x, int y, int v)
  33. {
  34. E[++totE] = (edge){y, g[x], v}; g[x] = totE;
  35. }
  36.  
  37. int build(int l, int r)
  38. {
  39. int x = ++totn;
  40. setv[x] = ;
  41. if(l == r) return x;
  42. int mid = (l+r)>>;
  43. l(x) = build(l, mid);
  44. r(x) = build(mid+, r);
  45. return x;
  46. }
  47.  
  48. void push(int x)
  49. {
  50. if(!setv[x]) return;
  51. setv[l(x)] = setv[x];
  52. setv[r(x)] = setv[x];
  53. setv[x] = ;
  54. }
  55.  
  56. int ask(int x, int l, int r, int qx)
  57. {
  58. if(l<r) push(x);
  59. if(l == r) return setv[x];
  60. int mid = (l+r)>>;
  61. if(qx <= mid) return ask(l(x), l, mid, qx);
  62. else return ask(r(x), mid+, r, qx);
  63. }
  64.  
  65. void change(int x, int l, int r, int ql, int qr, int qv)
  66. {
  67. if(l<r) push(x);
  68. if(ql<=l && r<=qr)
  69. {
  70. setv[x] = qv;
  71. return;
  72. }
  73. int mid=(l+r)>>;
  74. if(ql <= mid) change(l(x),l,mid,ql,qr,qv);
  75. if(mid < qr) change(r(x),mid+,r,ql,qr,qv);
  76. }
  77.  
  78. int dist(int x, int y)
  79. {
  80. if(de[x] < de[y]) swap(x, y);
  81. int ans = ;
  82. for(int i = ;~i;i--)
  83. if(de[fa[x][i]] >= de[y]) ans += dis[x][i], x = fa[x][i];
  84. if(x == y) return ans;
  85. for(int i = ;~i;i--)
  86. if(fa[x][i] != fa[y][i])
  87. {
  88. ans += dis[x][i]; x = fa[x][i];
  89. ans += dis[y][i]; y = fa[y][i];
  90. }
  91. return ans+dis[x][]+dis[y][];
  92. }
  93.  
  94. void dfs1(int x, int tmp)
  95. {
  96. siz[x] = ;
  97. h[x] = ;
  98. for(int i = g[x];i;i = E[i].to)
  99. if(!v[p] && p != tmp)
  100. {
  101. dfs1(p, x);
  102. h[x] = max(h[x], siz[p]);
  103. siz[x] += siz[p];
  104. }
  105. h[x] = max(h[x], lef_now - siz[x]);
  106. if(!hev || h[x] < h[hev]) hev = x;
  107. }
  108.  
  109. void dfs(int x)
  110. {
  111. for(int i = g[x];i;i = E[i].to)
  112. if(p != fa[x][])
  113. {
  114. fa[p][] = x;
  115. dis[p][] = E[i].v;
  116. de[p] = de[x] + ;
  117. dfs(p);
  118. }
  119. }
  120.  
  121. void dfs2(int x, int tmp, int now)
  122. {
  123. nod[now].push_back(MP(d[x], x));
  124. for(int i = g[x];i;i = E[i].to)
  125. if(!v[p] && p != tmp)
  126. {
  127. d[p] = d[x] + E[i].v;
  128. dfs2(p, x, now);
  129. }
  130. }
  131.  
  132. void solve(int x)
  133. {
  134. v[x] = ;
  135. d[x] = ;
  136. dfs2(x, x, x);
  137. sort(nod[x].begin(), nod[x].end());
  138. for(int i = ;i < (int)nod[x].size();i++)
  139. {
  140. id[x].push_back( MP(nod[x][i].second, i) );
  141. hevs[nod[x][i].second].push_back(x);
  142. }
  143. sort(id[x].begin(), id[x].end());
  144. root[x] = build(, nod[x].size()-);
  145. for(int i = g[x];i;i = E[i].to)
  146. if(!v[p])
  147. {
  148. hev = ;
  149. lef_now = siz[p];
  150. dfs1(p, x);
  151. solve(hev);
  152. }
  153. }
  154.  
  155. int find(int x,int len)
  156. {
  157. int l=,r=nod[x].size()-;
  158. while(r-l>)
  159. {
  160. int mid = (l+r)>>;
  161. if(nod[x][mid].first <= len) l=mid;
  162. else r=mid;
  163. }
  164. for(int i=r;i>=l;i--)
  165. if(nod[x][i].first <= len) return i;
  166. return -;
  167. }
  168.  
  169. void com_change(int x, int len, int v)
  170. {
  171. for(int i = ;i < (int)hevs[x].size();i++)
  172. {
  173. int tmp = hevs[x][i];
  174. int t = find(tmp, len - dist(x, tmp));
  175. if(t == -) continue;
  176. change(root[tmp], , id[tmp].size()-, , t, v);
  177. }
  178. }
  179.  
  180. int com_ask(int x)
  181. {
  182. int ans = ;
  183. for(int i = ;i < (int)hevs[x].size();i++)
  184. {
  185. int tmp = hevs[x][i];
  186. int t = (*lower_bound(id[tmp].begin(), id[tmp].end(), MP(x, -))).second;
  187. ans = max(ans, ask(root[tmp], , id[tmp].size()-, t));
  188. }
  189. return col[ans];
  190. }
  191.  
  192. int main()
  193. {
  194. scanf("%d", &n);
  195. for(int i = , x, y, v;i < n;i++)
  196. {
  197. scanf("%d %d %d", &x, &y, &v);
  198. addedge(x, y, v);
  199. addedge(y, x, v);
  200. }
  201. de[]=;
  202. dfs();
  203. for(int j = ;j <= ;j++)
  204. {
  205. for(int i = ;i <= n;i++)
  206. {
  207. fa[i][j] = fa[fa[i][j-]][j-];
  208. dis[i][j] = dis[fa[i][j-]][j-] + dis[i][j-];
  209. }
  210. }
  211. totn = ;
  212. hev = ;
  213. lef_now = n;
  214. dfs1(, );
  215. solve(hev);
  216. scanf("%d", &m);
  217. int x,cmd,len,tot=;
  218. while(m--)
  219. {
  220. scanf("%d%d",&cmd,&x);
  221. if(cmd==)
  222. {
  223. scanf("%d%d",&len,&col[++tot]);
  224. com_change(x,len,tot);
  225. }
  226. else printf("%d\n",com_ask(x));
  227. }
  228. return ;
  229. }

LWDB的更多相关文章

  1. 【Codeforces】Gym100633 D. LWDB

    题解 点分治,然后每个点上挂着一个距离不超过\(a_{i}\)的颜色改成\(c\) 用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色 ...

  2. XV Open Cup named after E.V. Pankratiev. GP of Tatarstan

    A. Survival Route 留坑. B. Dispersed parentheses $f[i][j][k]$表示长度为$i$,未匹配的左括号数为$j$,最多的未匹配左括号数为$k$的方案数. ...

  3. 转weblogic 10.3新建域

    一.安装前准备 1.解决linux中文乱码问题 修改/etc/sysconfig/i18n文件 #LANG="en_US.UTF-8"#SUPPORTED="en_US. ...

  4. SQL Server优化技巧之SQL Server中的"MapReduce"

    日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的”类MapReduce”方式,在特定的统计情形中 ...

  5. 写给iOS程序员的命令行使用秘籍

    http://www.jianshu.com/p/44d3b8f713f2 Mac OS是Unix系统的分支,有着强大的命令行功能.很多事情在命令行下处理会事半功倍,所以我就iOS程序员可能会用到的功 ...

  6. VxWorks 引导程序

    前言:vxworks 的一些文件,如 usrconfig.c 在 config,comp目录中均有出现,因编译方式而选择某一个文件,命令行方式采用 config 目录文件,tornado 图形界面配置 ...

随机推荐

  1. shell(2):正则表达式

    一.整理正则表达式博客 (1)正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linux中,通配符是由shel ...

  2. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  3. IOS AFNETWORKING POST

    IOS AFNETWORKING POST 请求 #pragma mark post 请求 // 获取 url 路劲,不带参数 NSString *requestUrl = [[url compone ...

  4. poj 3233 Matrix Power Series(矩阵二分,高速幂)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 15739   Accepted:  ...

  5. JavaScript读书笔记(2)--数据类型

    1.  严格模式:在javascript中定义了一种不同的解析与执行模型.在严格模式下,一些不确定的行为将得到处理,对某些不安全的操作也会抛出错误. 用法是在脚本中添加:”use strict”; 这 ...

  6. iOS 后台返回json解析出现的null的解决办法

    在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃.当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据.当我们通 ...

  7. C# WPF DataGrid控件实现三级联动

    利用DataGrid控件实现联动的功能,在数据库客户软件中是随处可见的,然而网上的资料却是少之又少,令人崩溃. 本篇博文将介绍利用DataGrid控件模板定义的三个ComboBox实现“省.市.区”的 ...

  8. Hadoop实战-Flume之Hello world(九)

    环境介绍: 主服务器ip:192.168.80.128 1.准备apache-flume-1.7.0-bin.tar文件 2.上传到master(192.168.80.128)服务器上 3.解压apa ...

  9. Android笔记之为TextView设置边框

    效果图 text_view_background.xml <?xml version="1.0" encoding="utf-8"?> <sh ...

  10. DuiLib笔记之Control常用属性

    name 指定控件名称,同一窗口内必须唯一,类型:STRING float 用于指定控件是否使用绝对定位,或设置FloatPercent,类型:BOOL,默认值为false,格式:float=&quo ...