BZOJ #5457: 城市 [线段树合并]
线段树合并的板子题,每次从下到上合并就完事了
// by Isaunoya
#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, n) for (int i = j; i <= n; i++)
#define in cin
#define out cout
#define pii pair<int, int>
#define fir first
#define sec second
int n, m;
const int maxn = 4e5 + 54;
int rt[maxn], ls[maxn << 5], rs[maxn << 5], cnt = 0;
pii mx[maxn << 5], ans[maxn];
void upd(int& p, int l, int r, int x, int v) {
if (!p) p = ++cnt;
if (l == r) {
mx[p] = { v, -x };
return;
}
int mid = l + r >> 1;
if (x <= mid)
upd(ls[p], l, mid, x, v);
else
upd(rs[p], mid + 1, r, x, v);
mx[p] = max(mx[ls[p]], mx[rs[p]]);
}
int merge(int x, int y, int l, int r) {
if (!x || !y) return x | y;
if (l == r) {
mx[x].fir += mx[y].fir;
return x;
}
int mid = l + r >> 1;
ls[x] = merge(ls[x], ls[y], l, mid);
rs[x] = merge(rs[x], rs[y], mid + 1, r);
mx[x] = max(mx[ls[x]], mx[rs[x]]);
return x;
}
vector<int> g[maxn];
int fa[maxn];
void dfs(int u) {
// for (int v : g[u])
// if (fa[u] ^ v) fa[v] = u, dfs(v);
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (fa[u] ^ v) {
fa[v] = u;
dfs(v);
}
}
ans[u] = mx[rt[u]];
rt[fa[u]] = merge(rt[fa[u]], rt[u], 1, n);
}
signed main() {
// code begin.
ios ::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
in >> n >> m;
rep(i, 2, n) {
int u, v;
in >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
rep(i, 1, n) {
int a, b;
in >> a >> b;
upd(rt[i], 1, n, a, b);
}
dfs(1);
rep(i, 1, n) out << -ans[i].sec << ' ' << ans[i].fir << '\n';
return out.flush(), 0;
// code end.
}
BZOJ #5457: 城市 [线段树合并]的更多相关文章
- BZOJ:5457: 城市(线段树合并)(尚待优化)
5457: 城市 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Discuss] Des ...
- BZOJ 4530 LCT/线段树合并
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using nam ...
- 线段树合并 || BZOJ 5457: 城市
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=5457 题解: 线段树合并,对于每个节点维护sum(以该节点为根的子树中最大的种类和)和kin ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
随机推荐
- 《算法九》(A星寻路算法)
A星寻路: 结构:N叉树 直线代价斜线代价:符合勾股定理 代价:每走一步,距离终点所付出的 计算公式:f = g + h + w; f : 当前点到终点的代价 g : 起点到当前点的代价 h : 当前 ...
- JDBC——CreateStatement和PrepareStatement作用区别
本文主要讲了PrepareStatement和CreateStatement的作用区别,大家可以一起学习!走后端的小伙伴都会必修JDBC,在前段时间作者实训期间,看到老师举例的时候用了CreateSt ...
- 安卓开发实战-记账本APP(五)
今天将昨天剩余的bug修复,并且完成图标的美化,设置长按删除,模仿支付宝实现金额的动态增加. ①将昨天的布局进行了修改:之前是fragment,改成FrameLayout布局,不再设置name,进而在 ...
- Spring基于注解配置AOP
D:\Java\IdeaProjects\JavaProj\SpringHelloWorld\src\aop.xml <?xml version="1.0" encoding ...
- POJ_1182_并查集
http://poj.org/problem?id=1182 pre构建有关系的号码的树,rel保存当前号码与根的关系,0表示相同,1表示根吃当前,2表示当前吃根. 代码中的更新公式可以先把各种情况枚 ...
- Standby Redo Logs的前世今生与最佳实践
编辑手记:使用过Data Guard的人应该对于Standby Redo Logs都不陌生,在配置了 Standby Redo Logs的standby中,能够进行日志的实时应用,同时Standby ...
- 2 深入分析 Java IO的工作机制(一)
大部分Web应用系统的瓶颈都是I/O瓶颈 2.1 Java的I/O类库的基本架构 Java的I/O操作类在包java.io下,大概有将近80个类,这些类大概可以分成如下4组. 基于字节操作的I/O接口 ...
- java8 Stream API笔记
生成Stream Source的方式 从Collection和数组生成 * Collection.stream() * Collection.parallelStream() * Arrays.str ...
- JavaScript 构造函数的继承
JavaScript 构造函数的继承 在上一篇文章中讲述了 JS 对象.构造函数以及原型模式,这篇文章来讨论下 JavaScript 的继承 继承是 OO 语言中的一个最为人津津乐道的概念.许多 OO ...
- MySql基础补漏笔记
在MySQL教程|菜鸟教程系统复习的时候有一些知识点还没掌握透的或者思维方式还没完全跟上的地方,写了一个笔记,讲道理此笔记对除我之外的任何读者不具有任何实用价值,只针对我在复习MySQL基础过程中的查 ...