树链剖分处理+线段树解决问题 HDU 5029
http://acm.split.hdu.edu.cn/showproblem.php?pid=5029
题意:n个点的树,m次操作。每次操作输入L,R,V,表示在[L,R]这个区间加上V这个数字。比如[1,2]加上1,[1,3]加上1,那么1这个点就是{1,1},2也是{1,1},3是{1}。全部操作操作完之后,输出每个点中,最多的那个数字有几个。如果有相同的数字,就输出最小的那个数。比如{1,1,2,2},就输出1。
思路:树链剖分拍成链,然后通过找LCA,来离线预处理,然后最后通过离线暴力一遍线段树,来完成询问操作(md,add这个函数错了4个小时TAT)
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 1e5 + ;
int belong[maxn], pos[maxn], son[maxn], id[maxn];
int par[maxn], sz[maxn], deep[maxn], ans[maxn];
int n, m, dfstime;
vector<int> G[maxn];
vector<pair<int, int> > color[maxn];
int tree[maxn << ]; void init(){
for (int i = ; i <= n; i++) G[i].clear();
for (int i = ; i <= ; i++) color[i].clear();
memset(belong, , sizeof(belong));
memset(son, , sizeof(son));
memset(par, , sizeof(par));
memset(deep, , sizeof(deep));
memset(sz, , sizeof(sz));
for (int i = ; i < n; i++){
int u, v; scanf("%d%d", &u, &v);
G[u].pb(v), G[v].pb(u);
}
} void dfs_size(int u, int fa, int road){
deep[u] = road, par[u] = fa;
sz[u] = ;
for (int i = ; i < G[u].size(); i++){
int v = G[u][i];
if (v == fa) continue;
dfs_size(v, u, road + );
sz[u] += sz[v];
if (sz[v] > sz[son[u]]) son[u] = v;
}
} void dfs_tree(int u, int fa, int chain){
pos[u] = ++dfstime; belong[u] = chain; id[dfstime] = u;
if (son[u] == ) return ;
dfs_tree(son[u], u, chain);
for (int i = ; i < G[u].size(); i++){
int v = G[u][i];
if (v == fa || v == son[u]) continue;
dfs_tree(v, u, v);
}
} void add(int x, int y, int c){///加入边
while (belong[x] != belong[y]){
if (deep[belong[x]] < deep[belong[y]]) swap(x, y);
color[pos[belong[x]]].push_back(mk(c, ));
color[pos[x] + ].push_back(mk(c, -));
x = par[belong[x]];
}
if (deep[x] < deep[y]) swap(x, y);
color[pos[y]].push_back(mk(c, )), color[pos[x] + ].push_back(mk(c, -));
} void update(int p, int l, int r, int o, int val){
if (p == l && p == r){
tree[o] += val; return ;
}
int mid = (l + r) / , lb = o << , rb = o << | ;
if (p <= mid) update(p, l, mid, lb, val);
if (p > mid) update(p, mid + , r, rb, val);
tree[o] = max(tree[lb], tree[rb]);
} int query(int l, int r, int o){
if (l == r) {
if (tree[o] == ) return ;
return l;
}
int mid = (l + r) / , lb = o << , rb = o << | ;
if (tree[lb] >= tree[rb]) return query(l, mid, lb);
else return query(mid + , r, rb);
} int main(){
while (scanf("%d%d", &n, &m) == ){
if (n == && m == ) break;
init(); dfstime = ;
dfs_size(, , );
dfs_tree(, , );
for (int i = ; i <= m; i++){
int x, y, z; scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
}
memset(tree, , sizeof(tree));
for (int i = ; i <= n; i++){
for (int j = ; j < color[i].size(); j++){
int c = color[i][j].first, val = color[i][j].second;
update(c, , , , val);
}
ans[id[i]] = query(, , );
}
for (int i = ; i <= n; i++){
printf("%d\n", ans[i]);
}
}
return ;
}
树链剖分处理+线段树解决问题 HDU 5029的更多相关文章
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
- 【洛谷5439】【XR-2】永恒(树链剖分,线段树)
[洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...
随机推荐
- 软件工程第八周PSP
1.本周PSP 2.本周进度条 代码行数 0 博文字数 356 知识点 无 3.时间分配饼状图 4.折线图
- 第四周 实验一 Java开发环境的熟悉 报告
Java开发环境的熟悉 实验内容 1.IDEA的安装过程 2.使用IDEA代替虚拟机运行.编译.调试Java程序 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)&g ...
- HDU 5636 Shortest Path
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 题解: 1.暴力枚举: #include<cmath> #include<c ...
- jsonFormater之应用
html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- UEditor前端配置项说明
UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ...
- sleep() 与 wait()的比较
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还 ...
- nodejs 调试
什么语言入门的准备功能就是写helloworld, 调试. 用惯了chrome的话,推荐用chrome自带的调试器来调试.很方便. 在地址栏中输入 chrome://inspect 并按回车,会打开如 ...
- 我以前不知道的 Session
之前只知道 Session 是服务器与客户端的一个会话,有默认过期时间,是服务器端的技术,与之对应的是 Cookie 技术,是客户端技术. 下面的几点是之前不知道的:[或者是忘了] 1 . Sessi ...
- 【数据库】SQL分组多列统计(GROUP BY后按条件分列统计)
select whbmbh ,zt,1 as tjsl from fyxx group by zt,whbmbh select whbmbh,sum(case zt when '有效' then 1 ...
- java map的 keyset()方法