hdu6133 Army Formations 线段树合并
给你一棵有n个节点的二叉树,每个节点有一个权值,对于一棵子树u,将u的子树中的节点权值从大到小排序,令sz[u]为子树u的大小,
则ans[u] = 1 * a[1] + 2 * a[2] + ... + sz[u] * a[sz[u]],其中a[1] >= a[2] >= ... >= a[u]。求所有节点的答案。
对每个节点建立权值线段树,dfs整棵树,线段树合并
ans[rt] = ans[ls[rt]] + ans[rs[rt]] + size[ls[rt]] * w[rs[rt]],w表示某权值区间的权值和,size表示某权值区间内点的个数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e5 + ;
const int maxnode = 2e6 + ;
struct edge { int to, next; }e[maxn << ];
int head[maxn], ecnt;
void edge_init() { ecnt = ; memset(head, -, sizeof(head)); }
void add(int u, int v) {
e[ecnt].to = v; e[ecnt].next = head[u]; head[u] = ecnt++;
}
int a[maxn], b[maxn];
int root[maxn];
int sz[maxnode], ls[maxnode], rs[maxnode];
long long ans[maxnode], sum[maxnode];
int tot, m; int mergeleaf(int u, int v) {
sz[u] += sz[v];
sum[u] += sum[v];
ans[u] = sum[u] / (long long)sz[u] * (long long) sz[u] * (long long) (sz[u] + 1LL) / 2LL;
return u;
} int merge(int u, int v, int l, int r) {
if (!u || !v) return u | v;
if (l == r) return mergeleaf(u, v);
int mid = (l + r) >> ;
ls[u] = merge(ls[u], ls[v], l, mid);
rs[u] = merge(rs[u], rs[v], mid + , r);
sz[u] = sz[ls[u]] + sz[rs[u]];
sum[u] = sum[ls[u]] + sum[rs[u]];
ans[u] = ans[ls[u]] + ans[rs[u]] + sum[ls[u]] * (long long) sz[rs[u]];
return u;
} void update(int x, int &rt, int l, int r) {
if (!rt) rt = ++tot;
sum[rt] = ans[rt] = (long long) b[x];
sz[rt] = ;
if (l == r) return;
int mid = (l + r) >> ;
if (x <= mid) update(x, ls[rt], l, mid);
else update(x, rs[rt], mid + , r);
} void dfs(int u, int fa) {
update(a[u], root[u], , m);
for (int i = head[u]; i != -; i = e[i].next) {
int v = e[i].to;
if (v == fa) continue;
dfs(v, u);
root[u] = merge(root[u], root[v], , m);
}
} int main() {
int T, n;
scanf("%d", &T);
while (T--) {
edge_init();
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%d", a + i), b[i] = a[i];
sort(b + , b + + n);
m = unique(b + , b + + n) - (b + );
for (int i = ; i <= n; ++i) a[i] = lower_bound(b + , b + + m, a[i]) - b;
for (int u, v ,i = ; i < n; ++i) {
scanf("%d%d", &u, &v);
add(u, v); add(v, u);
}
tot = ;
memset(root, , sizeof(root));
dfs(, );
for (int i = ; i <= n; ++i) printf("%lld ", ans[root[i]]);
puts("");
for (int i = ; i <= tot; ++i) ls[i] = rs[i] = sum[i] = ans[i] = sz[i] = ;
}
}
hdu6133 Army Formations 线段树合并的更多相关文章
- 2017多校第8场 HDU 6133 Army Formations 线段树合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6133 题意:给你一棵n个节点的二叉树,每个节点有一个提交任务的时间,每个节点总的提交任务的罚时为:提交 ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )
路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
[bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...
- bzoj3702二叉树 线段树合并
3702: 二叉树 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 600 Solved: 272[Submit][Status][Discuss] ...
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
随机推荐
- 百度的富文本编辑器UEditor批量添加图片自动加上宽度和高度的属性
若是没有对编辑器做任何配置直接添加图片的话,显示的html内容如下图所示:它会显示出原图片尺寸 所以必须要对图片的初始显示尺寸做控制:ueditor文件中找到image.js文件 在image.js中 ...
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- 18.0-uC/OS-III挂起内核对象
任务等待多个对象.然而, uC/OS-III只允许同时等待多个信号量和消息队列.换句话说,不能同时等待多个事件标志组或mutex. 1.任务可以同时等待多个信号量和消息队列. 任务接收到一个信号量或消 ...
- webstorm 配置 开发微信小程序
默认情况下,webstorm是不支持wxml和wxss的文件类型,不会有语法高亮 设置高亮 除了高亮,还需要代码提示, 所幸已经有前辈整理了小程序的代码片段,只需要导入其安装包即可使用,包文件路径如下 ...
- 小程序 切换到tabBar页面不刷新问题
小程序跳转的几种方式有wx.navigateTo,wx.redirectTo,wx.reLaunch,wx.switchTab等.下面我们重点研究切换到tabBar的两种方式. wx.switchTa ...
- windows程序设计 显示一个窗口
#include <windows.h> HINSTANCE hinst; LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM) ...
- Hbaseflush处理流程
Hbaseflush处理流程 flush的处理是个生产者消费者模式,通过MemStoreFlusher.requestFlush或者requestDelayedFlush来收集请求,通过多个Flush ...
- 宝岛探险,DFS&BFS
问题描述: 小哼通过秘密方法得到一张不完整的钓鱼岛航拍地图.钓鱼岛由一个主岛和一些附属岛屿组成,小哼决定去钓鱼岛探险.下面这个10*10的二维矩阵就是钓鱼岛的航拍地图.图中数字表示海拔,0表示海洋,1 ...
- Vue系列之 => 父组件向子组件传值
父组件向子组件传递数据 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta c ...
- python selenium基于显示等待封装的一些常用方法
import os import time from PIL import Image from selenium import webdriver from appium import webdri ...