LWDB
题意:
给一棵 $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)$
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #include <algorithm>
- #define p E[i].x
- #define N 100010
- #define M 7000010
- #define l(x) ch[x][0]
- #define r(x) ch[x][1]
- #define MP(x, y) make_pair(x, y)
- #define LL long long
- using namespace std;
- typedef pair<int,int> PII;
- struct edge
- {
- int x, to, v;
- }E[N<<];
- int totE, totn, n, m, hev, lef_now;
- int g[N], h[N], de[N], siz[N], root[N], fa[N][], col[N], d[N];
- int ch[M][], setv[M];
- vector<PII> nod[N], id[N];
- vector<int> hevs[N];
- int dis[N][];
- bool v[N];
- void addedge(int x, int y, int v)
- {
- E[++totE] = (edge){y, g[x], v}; g[x] = totE;
- }
- int build(int l, int r)
- {
- int x = ++totn;
- setv[x] = ;
- if(l == r) return x;
- int mid = (l+r)>>;
- l(x) = build(l, mid);
- r(x) = build(mid+, r);
- return x;
- }
- void push(int x)
- {
- if(!setv[x]) return;
- setv[l(x)] = setv[x];
- setv[r(x)] = setv[x];
- setv[x] = ;
- }
- int ask(int x, int l, int r, int qx)
- {
- if(l<r) push(x);
- if(l == r) return setv[x];
- int mid = (l+r)>>;
- if(qx <= mid) return ask(l(x), l, mid, qx);
- else return ask(r(x), mid+, r, qx);
- }
- void change(int x, int l, int r, int ql, int qr, int qv)
- {
- if(l<r) push(x);
- if(ql<=l && r<=qr)
- {
- setv[x] = qv;
- return;
- }
- int mid=(l+r)>>;
- if(ql <= mid) change(l(x),l,mid,ql,qr,qv);
- if(mid < qr) change(r(x),mid+,r,ql,qr,qv);
- }
- int dist(int x, int y)
- {
- if(de[x] < de[y]) swap(x, y);
- int ans = ;
- for(int i = ;~i;i--)
- if(de[fa[x][i]] >= de[y]) ans += dis[x][i], x = fa[x][i];
- if(x == y) return ans;
- for(int i = ;~i;i--)
- if(fa[x][i] != fa[y][i])
- {
- ans += dis[x][i]; x = fa[x][i];
- ans += dis[y][i]; y = fa[y][i];
- }
- return ans+dis[x][]+dis[y][];
- }
- void dfs1(int x, int tmp)
- {
- siz[x] = ;
- h[x] = ;
- for(int i = g[x];i;i = E[i].to)
- if(!v[p] && p != tmp)
- {
- dfs1(p, x);
- h[x] = max(h[x], siz[p]);
- siz[x] += siz[p];
- }
- h[x] = max(h[x], lef_now - siz[x]);
- if(!hev || h[x] < h[hev]) hev = x;
- }
- void dfs(int x)
- {
- for(int i = g[x];i;i = E[i].to)
- if(p != fa[x][])
- {
- fa[p][] = x;
- dis[p][] = E[i].v;
- de[p] = de[x] + ;
- dfs(p);
- }
- }
- void dfs2(int x, int tmp, int now)
- {
- nod[now].push_back(MP(d[x], x));
- for(int i = g[x];i;i = E[i].to)
- if(!v[p] && p != tmp)
- {
- d[p] = d[x] + E[i].v;
- dfs2(p, x, now);
- }
- }
- void solve(int x)
- {
- v[x] = ;
- d[x] = ;
- dfs2(x, x, x);
- sort(nod[x].begin(), nod[x].end());
- for(int i = ;i < (int)nod[x].size();i++)
- {
- id[x].push_back( MP(nod[x][i].second, i) );
- hevs[nod[x][i].second].push_back(x);
- }
- sort(id[x].begin(), id[x].end());
- root[x] = build(, nod[x].size()-);
- for(int i = g[x];i;i = E[i].to)
- if(!v[p])
- {
- hev = ;
- lef_now = siz[p];
- dfs1(p, x);
- solve(hev);
- }
- }
- int find(int x,int len)
- {
- int l=,r=nod[x].size()-;
- while(r-l>)
- {
- int mid = (l+r)>>;
- if(nod[x][mid].first <= len) l=mid;
- else r=mid;
- }
- for(int i=r;i>=l;i--)
- if(nod[x][i].first <= len) return i;
- return -;
- }
- void com_change(int x, int len, int v)
- {
- for(int i = ;i < (int)hevs[x].size();i++)
- {
- int tmp = hevs[x][i];
- int t = find(tmp, len - dist(x, tmp));
- if(t == -) continue;
- change(root[tmp], , id[tmp].size()-, , t, v);
- }
- }
- int com_ask(int x)
- {
- int ans = ;
- for(int i = ;i < (int)hevs[x].size();i++)
- {
- int tmp = hevs[x][i];
- int t = (*lower_bound(id[tmp].begin(), id[tmp].end(), MP(x, -))).second;
- ans = max(ans, ask(root[tmp], , id[tmp].size()-, t));
- }
- return col[ans];
- }
- int main()
- {
- scanf("%d", &n);
- for(int i = , x, y, v;i < n;i++)
- {
- scanf("%d %d %d", &x, &y, &v);
- addedge(x, y, v);
- addedge(y, x, v);
- }
- de[]=;
- dfs();
- for(int j = ;j <= ;j++)
- {
- for(int i = ;i <= n;i++)
- {
- fa[i][j] = fa[fa[i][j-]][j-];
- dis[i][j] = dis[fa[i][j-]][j-] + dis[i][j-];
- }
- }
- totn = ;
- hev = ;
- lef_now = n;
- dfs1(, );
- solve(hev);
- scanf("%d", &m);
- int x,cmd,len,tot=;
- while(m--)
- {
- scanf("%d%d",&cmd,&x);
- if(cmd==)
- {
- scanf("%d%d",&len,&col[++tot]);
- com_change(x,len,tot);
- }
- else printf("%d\n",com_ask(x));
- }
- return ;
- }
LWDB的更多相关文章
- 【Codeforces】Gym100633 D. LWDB
题解 点分治,然后每个点上挂着一个距离不超过\(a_{i}\)的颜色改成\(c\) 用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色 ...
- XV Open Cup named after E.V. Pankratiev. GP of Tatarstan
A. Survival Route 留坑. B. Dispersed parentheses $f[i][j][k]$表示长度为$i$,未匹配的左括号数为$j$,最多的未匹配左括号数为$k$的方案数. ...
- 转weblogic 10.3新建域
一.安装前准备 1.解决linux中文乱码问题 修改/etc/sysconfig/i18n文件 #LANG="en_US.UTF-8"#SUPPORTED="en_US. ...
- SQL Server优化技巧之SQL Server中的"MapReduce"
日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的”类MapReduce”方式,在特定的统计情形中 ...
- 写给iOS程序员的命令行使用秘籍
http://www.jianshu.com/p/44d3b8f713f2 Mac OS是Unix系统的分支,有着强大的命令行功能.很多事情在命令行下处理会事半功倍,所以我就iOS程序员可能会用到的功 ...
- VxWorks 引导程序
前言:vxworks 的一些文件,如 usrconfig.c 在 config,comp目录中均有出现,因编译方式而选择某一个文件,命令行方式采用 config 目录文件,tornado 图形界面配置 ...
随机推荐
- shell(2):正则表达式
一.整理正则表达式博客 (1)正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linux中,通配符是由shel ...
- 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.单继 ...
- IOS AFNETWORKING POST
IOS AFNETWORKING POST 请求 #pragma mark post 请求 // 获取 url 路劲,不带参数 NSString *requestUrl = [[url compone ...
- poj 3233 Matrix Power Series(矩阵二分,高速幂)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 15739 Accepted: ...
- JavaScript读书笔记(2)--数据类型
1. 严格模式:在javascript中定义了一种不同的解析与执行模型.在严格模式下,一些不确定的行为将得到处理,对某些不安全的操作也会抛出错误. 用法是在脚本中添加:”use strict”; 这 ...
- iOS 后台返回json解析出现的null的解决办法
在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃.当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据.当我们通 ...
- C# WPF DataGrid控件实现三级联动
利用DataGrid控件实现联动的功能,在数据库客户软件中是随处可见的,然而网上的资料却是少之又少,令人崩溃. 本篇博文将介绍利用DataGrid控件模板定义的三个ComboBox实现“省.市.区”的 ...
- 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 ...
- Android笔记之为TextView设置边框
效果图 text_view_background.xml <?xml version="1.0" encoding="utf-8"?> <sh ...
- DuiLib笔记之Control常用属性
name 指定控件名称,同一窗口内必须唯一,类型:STRING float 用于指定控件是否使用绝对定位,或设置FloatPercent,类型:BOOL,默认值为false,格式:float=&quo ...