树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)
题意:
分粮食我就当成涂色了。有n个点的一棵树,在a到b的路上都涂上c颜色,颜色可重复叠加,问最后每一个点的最大颜色数量的颜色类型。
思路:
首先这题的输出是每一个点最后的情况,考虑离线做法。简化版问题:在一条线段上涂色,问每个点的最后的情况,假设在[a, b]区间涂色,那么在开始的位置a标记开始涂色,在结束的位置标记结束涂色,一棵动态的颜色树,维护当前颜色数量最大的数量。那么这题也可以考虑这么做,先对树进行树链剖分,然后按照剖分顺序dfn来遍历,提前读入所有操作,在涂色的两端标记,后面操作和简化版一样了。
#include <bits/stdc++.h> const int N = 1e5 + 5; std::vector<int> edges[N];
int n, m; //颜色树
#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1 int mx[N<<2]; void push_up(int o) {
mx[o] = std::max (mx[o<<1], mx[o<<1|1]);
} void build(int l, int r, int o) {
mx[o] = 0;
if (l == r) return ;
int mid = l + r >> 1;
build (lson);
build (rson);
} void updata(int p, int c, int l, int r, int o) {
if (l == r) {
mx[o] += c;
return ;
}
int mid = l + r >> 1;
if (p <= mid) updata (p, c, lson);
else updata (p, c, rson);
push_up (o);
} int query(int l, int r, int o) {
if (l == r) return l;
int mid = l + r >> 1;
if (mx[o<<1] == mx[o]) return query (lson);
else return query (rson);
} int sz[N], fa[N], dfn[N], belong[N];
int idx[N];
int tim; void DFS2(int u, int chain) {
dfn[u] = ++tim;
idx[tim] = u;
belong[u] = chain;
int k = 0;
for (auto v: edges[u]) {
if (v == fa[u]) continue;
if (sz[v] > sz[k]) k = v;
}
if (k) DFS2 (k, chain);
for (auto v: edges[u]) {
if (v == fa[u] || v == k) continue;
DFS2 (v, v);
}
} void DFS(int u, int pa) {
sz[u] = 1;
fa[u] = pa;
for (auto v: edges[u]) {
if (v == pa) continue;
DFS (v, u);
sz[u] += sz[v];
}
} std::vector<int> add[N], sub[N];
int ans[N]; void mark(int a, int b, int c) {
int p = belong[a], q = belong[b];
while (p != q) {
if (dfn[p] < dfn[q]) {
std::swap (p, q);
std::swap (a, b);
}
add[dfn[p]].push_back (c);
sub[dfn[a]+1].push_back (c); //son[a]
a = fa[p];
p = belong[a];
}
if (dfn[a] < dfn[b]) std::swap (a, b);
add[dfn[b]].push_back (c);
sub[dfn[a]+1].push_back (c);
} void prepare() {
sz[0] = 0;
DFS (1, 0);
tim = 0;
DFS2 (1, 1);
} int main() {
while (scanf ("%d%d", &n, &m) == 2 && n + m) {
for (int i=1; i<=n; ++i) {
edges[i].clear ();
add[i].clear ();
sub[i].clear ();
}
for (int i=1; i<n; ++i) {
int u, v;
scanf ("%d%d", &u, &v);
edges[u].push_back (v);
edges[v].push_back (u);
} prepare (); int maxc = 1;
for (int i=1; i<=m; ++i) {
int a, b, c;
scanf ("%d%d%d", &a, &b, &c);
mark (a, b, c);
maxc = std::max (maxc, c);
} build (1, maxc, 1); //dfn
for (int i=1; i<=n; ++i) {
for (int j=0; j<add[i].size (); ++j) {
updata (add[i][j], 1, 1, maxc, 1);
}
for (int j=0; j<sub[i].size (); ++j) {
updata (sub[i][j], -1, 1, maxc, 1);
}
ans[idx[i]] = mx[1] ? query (1, maxc, 1) : 0;
} for (int i=1; i<=n; ++i) {
printf ("%d\n", ans[i]);
}
}
return 0;
}
树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)的更多相关文章
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- HDU4897 (树链剖分+线段树)
Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
随机推荐
- nginx使用ngx_lua访问后端Thrift-Server实现和介绍
背景 随着openresty的出现,让nginx使用lua解决一些业务的能力大幅度提高,ngx_lua可以使用nginx自生的基于事件驱动的IO模型,和后端的存储,业务等系统实现非阻塞的连接交互. 如 ...
- Android中处理崩溃异常
转自:http://my.eoe.cn/817027/archive/17997.html 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不 ...
- [原创]webapp/css3实战,制作一个《炉石传说》宣传页
在移动网页,尤其是webapp中常需要用到大量的css3动画,来获得良好交互体验 我之前帮朋友做了一个,可惜没帮上忙现在和大家分享一下 目标是要做一个<炉石传说>游戏的介绍宣传页面,文字内 ...
- Sicily 1150: 简单魔板(BFS)
此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...
- erlang 虚机CPU 占用高排查
-问题起因 近期线上一组服务中,个别节点服务器CPU使用率很低,只有其他1/4.排除业务不均,曾怀疑是系统top统计错误,从Erlang调度器的利用率调查 找到通过erlang:statistics( ...
- Excel2013 基本用法(上)
自动填充 对于数字填充 Excel对于处理数据非常方便,比如我们需要输入一个班级的学号,就可以只输入2个学号然后快捷填充就可以完成一个班的学号输入(如下图). 快捷填充,就是将鼠标移动到选中的单元格边 ...
- git 命令熟悉
1. git clone +ssh 地址=将远程代码download 到本地:要在根目录执行这个操作 2.查看所有分支:git branch -a (当前分支前带星号) 3.切换到某个分支:git c ...
- Mac OS X 上安装 ASP.NET 5
在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本 ...
- php7 安装redis扩展
从pecl下载的phpredis扩展在make时报错,google了一下,解决办法,因为phpredis 有专门为php7的分支,所以先git clone phpredis下来 git clone h ...
- 整数转IP地址
将一个整数,比如1567898765转换为xxx.xxx.xxx.xxx的IP地址的形式, 以下是源代码 union IPNode{ unsigned int addr; struct { unsig ...