模拟赛的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 线段树合并的更多相关文章

  1. [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]

    [NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...

  2. 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 里遇到的 ...

  3. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

  4. Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)

    题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...

  5. [CF490F]Treeland Tour(线段树合并)

    树上LIS:树上找一条简单路径的子序列使点权严格单增,最大化长度. 原题数据过小,用线段树合并可以做到$O(n\log n)$. 每个点用一棵线段树维护以每个权值为结尾的LIS最长长度,线段树合并时更 ...

  6. bzoj 4631: 踩气球 线段树合并

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 265  Solved: 136[Submit][Status][Discuss] ...

  7. 【BZOJ-4556】字符串 后缀数组+二分+主席树 / 后缀自动机+线段树合并+二分

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 657  Solved: 274[Su ...

  8. 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)

    题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...

  9. [NOIP2016]天天爱跑步(树上差分+线段树合并)

    将每个人跑步的路径拆分成x->lca,lca->y两条路径分别考虑: 对于在点i的观察点,这个人(s->t)能被观察到的充要条件为: 1.直向上的路径:w[i]=dep[s]-dep ...

随机推荐

  1. chrome中显示DNS_PROBE_FINISHED_NO_INTERNET无法上网,但是IE可以上

    以管理员方式运行cmd,执行如下命令 ipconfig /release ipconfig /all ipconfig /flushdns ipconfig /renew netsh int ip s ...

  2. SAS学习笔记34 指针控制

    指针控制符分为行指针和列指针两种 列指针控制符模式 @n:指明列的开始位置,是对应变量的数据开始列位置 列控制符号模式 n1-n2:n1列开始位置,n2列结束位置 @与@@符号应用 @行控制符号,控制 ...

  3. substr函数索引创建测试

    技术群里小伙伴,沟通说一条经常查询的SQL缓慢,单表SQL一个列作为条件,列是int数值类型,索引类型默认创建. 一.SQL文本substr函数索引创建测试 ,) nm1 ')需求,将上述SQL执行速 ...

  4. MySQL5.7主从同步配置

    主从同步,将主服务器(master)上的数据复制到从服务器(slave). 应用场景 读写分离,提高查询访问性能,有效减少主数据库访问压力. 实时灾备,主数据库出现故障时,可快速切换到从数据库. 数据 ...

  5. (五)Redis之List

    一.List常用命令 两端添加 两端弹出 1.2. 两端添加和两端弹出 package myRedis01; import java.util.HashMap; import java.util.Li ...

  6. 查准率(precision)和查全率(recall)

    一.理解查准率(precision)& 查全率(recall) 我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的 ...

  7. XML-RPC-2RPC

    远程过程调用协议 RPC一般指远程过程调用协议 RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协 ...

  8. 初学java1 数据类型

    java数据类型 分为8种 整型 byte 8位 short 16位 int 32位 long 64位 字符型 char 必需为单引号'' 且只能有一个字符 浮点型 float double 布尔类型 ...

  9. “df: cannot read table of mounted file systems”.

    “df: cannot read table of mounted file systems”.“df -l” returned an error: “df: cannot read table of ...

  10. 基于PhotoView的头像/圆形裁剪控件

    常见的图片裁剪有两种,一种是图片固定,裁剪框移动放缩来确定裁剪区域,早期见的比较多,缺点在于不能直接预览裁剪后的效果:还有一种现在比较普遍了,就是裁剪框固定,直接拖动缩放图片,便于预览裁剪结果. 我做 ...