题意:

给一棵 $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的更多相关文章

  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. Libx264 编码错误 Input picture width(320) is greater than stride (0)

    Ffmpeg libx264编码出现 Input picture width(320) is greater than stride (0),问题出在视频格式不正确. libx264 编码要求输入源的 ...

  2. Mysql导出大量数据

    outfile 导出文件   select name from t1 into outfile "/tmp/test.txt"   infile 导入文件 导入到表t1中的name ...

  3. 【每日Scrum】第五天(4.15) TD学生助手Sprint1站立会议

    TD学生助手Sprint1站立会议(4.15) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天和静姐,娇哥把图片3D画廊效果的功能实现了,GPS功能没什么进展,所以只能继 ...

  4. struct platform_device中的id成员

    include/linux/platform_device.h #define PLATFORM_DEVID_NONE (-1) #define PLATFORM_DEVID_AUTO (-2) dr ...

  5. angularJS 自定义指令 分页

    原理和使用说明 1.插件源码主要基于angular directive来实现. 2.调用时关键地方是后台请求处理函数,也就是从后台取数据. 3.插件有两个关键参数currentPage.itemsPe ...

  6. 嵌入式开发之cgic库---cgi库的使用

    很幸运!用C语言写CGI程序还可以有比较简单的方式,那就是我们可以借助使用第三方库CGIC(CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作 ...

  7. elk 日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示clie ...

  8. Android-基本控件和详解四种布局方式

    转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...

  9. 九度OJ 1093:WERTYU (翻译)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1563 解决:609 题目描述: A common typing error is to place the hands on the ke ...

  10. 解析json的方式

    一.Javascrip操作json 原始方式: var str1 = '{ "name": "jacun", "addr": "b ...