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. Bate版本控制报告

    报告beta阶段2周中,项目的版本控制情况,不包括未在coding.net的部分. 包括不限于:check in (不是push)次数; 总词数为29次 check in log(时间.人员.mess ...

  2. 奥特曼小分队之we are a team

    团队名称:奥特曼小分队 团队博客链接:http://cnblogs.com/ATMXFD 团队负责跑腿的:李全清 http://www.cnblogs.com/QuanQingli/ 团队成员: 孙乐 ...

  3. TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)

    一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...

  4. MySQL 忘记root密码怎么办

    前言:记住如果忘记root密码,在启动MySQL的时候,跳过查询授权表就ok了. 对于RedHat 6 而言 (1)启动mysqld 进程时,为其使用:--skip-grant-tables --sk ...

  5. psp 第二周

    11号                                                                              12号 类别c 内容c 开始时间s 结 ...

  6. oracle 不能是用变量来作为列名和表名 ,但使用动态sql可以;

    ORACLE 不能使用变量来作为列名 和表名 一下是个人的一些验证: DECLARE ename1 emp.ename%TYPE ; TYPE index_emp_type ) INDEX BY PL ...

  7. git因commit的记录太大导致push失败解决方法

    发现好像这个方法不好使.......~~!还是会失败 如果有人或者自己失误把不该同步的大文件如数据或日志或其他中间文件给commit了并且push了,然后你删掉了,但是其实他仍然在你的git记录中,你 ...

  8. Mware中CentOS设置静态IP

    Mware中CentOS设置静态IP   因为之前搭建的MongoDB分片没有采用副本集,最近现网压力较大,所以准备研究一下,于是在自己电脑的虚拟机中搭建环境,但是发现之前VMware设置的是DHCP ...

  9. [C/C++] 虚函数机制

    转自:c++ 虚函数的实现机制:笔记 1.c++实现多态的方法 其实很多人都知道,虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?从more effecive c++其中一篇文章里面 ...

  10. node+express搭建个人网站(1)

    我的个人网站 http://yangchaojie.top/ 首先了解一下node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个 ...