Test 1 T2 B 线段树合并
模拟赛的T2,多敲了两行成功爆掉~
写线段树合并的时候一定要注意一下不能随意新开节点.
code:
#include <bits/stdc++.h>
#define N 100009
#define ll long long
#define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
int n,edges;
int A[N],hd[N],to[N<<1],nex[N<<1],kk[N],rt[N],ans1[N];
ll val[N<<1];
ll ans2[N];
void add(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
struct Segment_Tree
{
#define lson p[x].ls
#define rson p[x].rs
int tot;
struct Node
{
int ls,rs,size;
ll dis,num,rt,mul,maxx;
}p[N*90];
int newnode() { return ++tot; }
void mark(int x,ll d)
{
p[x].mul+=d;
p[x].rt+=d*p[x].num;
}
void pushdown(int x,int l,int r)
{
if(p[x].mul)
{
int mid=(l+r)>>1;
if(lson) mark(lson, p[x].mul);
if(rson) mark(rson, p[x].mul);
p[x].mul=0;
}
}
int merge(int l,int r,int u,int v)
{
if(!u||!v) return u+v;
pushdown(u,l,r);
pushdown(v,l,r);
int now=newnode();
p[now].dis=p[u].dis+p[v].dis+p[u].num*p[v].rt+p[u].rt*p[v].num;
p[now].num=p[u].num+p[v].num;
p[now].rt=p[u].rt+p[v].rt;
p[now].maxx=max(p[u].maxx, p[v].maxx);
if(l==r)
{
if(p[now].num) p[now].size=1;
p[now].maxx=p[now].dis;
return now;
}
int mid=(l+r)>>1;
p[now].ls=merge(l,mid,p[u].ls,p[v].ls);
p[now].rs=merge(mid+1,r,p[u].rs,p[v].rs);
p[now].size=p[p[now].ls].size+p[p[now].rs].size;
p[now].maxx=max(p[p[now].ls].maxx, p[p[now].rs].maxx);
return now;
}
int solve(int l,int r,int x)
{
if(l==r) return l;
int mid=(l+r)>>1;
pushdown(x,l,r);
if(l<=mid && p[lson].size && p[lson].maxx==p[x].maxx) return solve(l,mid,lson);
else return solve(mid+1,r,rson);
}
void update(int &x,int l,int r,int pp)
{
if(!x) x=newnode();
if(l==r)
{
p[x].size=1;
p[x].num=1;
return;
}
pushdown(x, l, r);
int mid=(l+r)>>1;
if(pp<=mid) update(lson,l,mid,pp);
else update(rson,mid+1,r,pp);
p[x].maxx=max(p[lson].maxx, p[rson].maxx);
p[x].size=p[lson].size+p[rson].size;
}
ll dfss(int l,int r,int x,int kth)
{
if(l==r) return p[x].dis;
int mid=(l+r)>>1;
pushdown(x,l,r);
int sz=p[lson].size;
if(sz>=kth) return dfss(l,mid,lson,kth);
else return dfss(mid+1,r,rson,kth-sz);
}
#undef lson
#undef rson
}seg;
void dfs(int u,int ff,int pp)
{
seg.update(rt[u],1,n,A[u]);
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs(v,u,val[i]);
}
if(seg.p[rt[u]].size<kk[u]) ans2[u]=-1;
else
{
ans2[u]=seg.dfss(1,n,rt[u],kk[u]);
}
ans1[u]=seg.solve(1,n,rt[u]);
seg.mark(rt[u], 1ll*pp);
rt[ff]=seg.merge(1,n,rt[u], rt[ff]);
}
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
for(i=1;i<n;++i)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c), add(u,v,c), add(v,u,c);
}
for(i=1;i<=n;++i) scanf("%d",&A[i]);
for(i=1;i<=n;++i) scanf("%d",&kk[i]);
dfs(1,0,0);
for(i=1;i<=n;++i) printf("%d %lld\n",ans1[i],ans2[i]);
return 0;
}
Test 1 T2 B 线段树合并的更多相关文章
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
- CEOI 2019 Day2 T2 魔法树 Magic Tree (LOJ#3166、CF1993B、and JOI2021 3.20 T3) (启发式合并平衡树,线段树合并)
前言 已经是第三次遇到原题. 第一次是在 J O I 2021 S p r i n g C a m p \rm JOI2021~Spring~Camp JOI2021 Spring Camp 里遇到的 ...
- Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
- [CF490F]Treeland Tour(线段树合并)
树上LIS:树上找一条简单路径的子序列使点权严格单增,最大化长度. 原题数据过小,用线段树合并可以做到$O(n\log n)$. 每个点用一棵线段树维护以每个权值为结尾的LIS最长长度,线段树合并时更 ...
- bzoj 4631: 踩气球 线段树合并
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 265 Solved: 136[Submit][Status][Discuss] ...
- 【BZOJ-4556】字符串 后缀数组+二分+主席树 / 后缀自动机+线段树合并+二分
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 657 Solved: 274[Su ...
- 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)
题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...
- [NOIP2016]天天爱跑步(树上差分+线段树合并)
将每个人跑步的路径拆分成x->lca,lca->y两条路径分别考虑: 对于在点i的观察点,这个人(s->t)能被观察到的充要条件为: 1.直向上的路径:w[i]=dep[s]-dep ...
随机推荐
- Oracle数据库——查询所有用户
查询数据库所有用户(ALL_USERS)的用户名,用户编号,创建日期 默认应该有36个用户 SELECT * FROM ALL_USERS; 查看ALL_USERS的结构 DESC ALL_USERS ...
- Asp.net core 学习笔记 2.2 migration to 3.0
Ef core 3.0 一些要注意的改变 refer : https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaki ...
- vscode安装
vscode是一个很好用而且开源的编辑器,支持多种编程语言,这里稍微总结一下使用,省的以后再安装时候再百度查 下载地址:https://code.visualstudio.com/,打开以后点击dow ...
- Unity性能优化-DrawCall
1. DrawCall是啥?其实就是对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西.所以,是谁去调用这些接口呢?CPU.比如有上千个物体,每一个的渲染都需要去调用一次底层接口 ...
- (七)Redis之Keys的通用操作
package myRedis01; import java.util.HashMap; import java.util.List; import java.util.Map; import jav ...
- CCF 2017-09-2 公共钥匙盒
CCF 2017-09-2 公共钥匙盒 题目 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室 ...
- linux gcc安装
2004年4月20日最新版本的GCC编译器3.4.0发布了.目前,GCC可以用来编译C/C++.FORTRAN.java.OBJC.ADA等语言的程序,可根据需要选择安装支持的语言.GCC 3.4.0 ...
- CUDA 笔记
名词解释 SM :Streaming Multiprocessor 而 Block 大致就是对应到 SM 所有的blocks 按照流水线被送到6个SM中进行计算 在 Compute Ca ...
- HashSet和CopyOnWriteArraySet(转载)
前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...
- elementui 树控件只隐藏第三集菜单
<!-- 必须属性:default-expanded-keys node-key --> <el-tree :default-expanded-keys='idArr' node-k ...