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的更多相关文章

  1. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  2. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  3. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  4. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  5. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  6. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  7. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  8. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  9. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

  10. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

随机推荐

  1. Alpha 冲刺10

    队名:日不落战队 安琪(队长) 今天完成的任务 整理项目. okhttp学习第四弹. 明天的计划 okhttp学习第五弹. 阶段反思. 睡觉. 还剩下的任务 个人信息数据get. 遇到的困难 困难:好 ...

  2. 第203天:js---Array对象常用方法

    1.shift:删除原数组的第一项,返回删除元素的值:如果数组为空则返回undefined //shift:删除原数组的第一项,返回删除元素的值:如果数组为空则返回undefined var arr ...

  3. 对Spark2.2.0文档的学习2-Job Scheduling

    Job Scheduling Link:http://spark.apache.org/docs/2.2.0/job-scheduling.html 概况: (1)集群中多个应用的调度主要考虑的是不同 ...

  4. poj1655 Balancing Act求树的重心

    Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any nod ...

  5. day 008 文件操作

    08. 万恶之源-⽂文件操作本节主要内容:1. 初识⽂文件操作2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 其他操 ...

  6. CF712E Memory and Casinos 期望概率

    题意:\(n\)个赌场,每个赌场有\(p_{i}\)的胜率,如果赢了就走到下一个赌场,输了就退回上一个赌场,规定\(1\)号赌场的上一个是\(0\)号赌场,\(n\)号赌场的下一个是\(n + 1\) ...

  7. 洛谷 P4585 [FJOI2015]火星商店问题 解题报告

    P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...

  8. 使用log4net将日志文件输出为csv格式

    我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应用程序产生的日志,而格式化不好的日志文件又为上 ...

  9. Android之框架20160721

    Android的四层架构分别为:Linux2.6内核层,核心库层,应用框架层,应用层. 其中Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我 ...

  10. OpenCV中响应鼠标消息 (转)

    #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment(lib," ...