模拟赛的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. unittest之二makeSuite\testload\discover及测试报告teseReport

    测试套件suite除了使用addTest以外,还有使用操作起来更更简便的makeSuite\testload\discover 1.makeSuite,创建测试套件,传的参数是要执行的测试用例所在的类 ...

  2. jq使用ajax请求,返回状态 canceled错误

    在使用jq,ajax请求时出现该错误 原因:button按钮类型为type=submit ,script中又自定用botton按钮点击提交ajax,造成冲突. 解决方法:button按钮类型改为 ty ...

  3. Unity场景间数据传递方法

    在游戏开发中,会常用到场景间传递数据的方法(比如关卡选择,过关后自动回到关卡选择界面,以动画方式解锁下一关),目前研究了三种: 1. 使用DontDestroyOnLoad方法: (1)在场景A中做个 ...

  4. java代码检出打包

    这里先提下前提,就是有个维护的(可能有二期的一个项目),后端是Java,由于很久都不做Java,剩下的只是不多了.之前做的Java容器要么是tomcat,要么接触过新的spring cloud.从来没 ...

  5. C#基础--AbStract与Interface

         Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...

  6. Django rest-framework框架-组件之视图

    视图: a. django class Test(View): ... b. rest_framework class Test(APIView): ... c. GenericAPIView 一般不 ...

  7. 决心学HTML 第一晚

    老师数他的审美观不行,怕教的我们的审美观也不行,所以,就不讲HTML了,但是期末又要考, 自己英语又不行,期末做项目又要用,我可能又要做组长,只能硬着头皮自学了. 所以,现在从第一页开始学!!! 这这 ...

  8. Css制作table细线表格

    制作细线表格,我想应该是最基本的css知识了,记录下来巩固下. 推荐: table{ border-collapse:collapse; border: 1px solid #000000; } td ...

  9. python2.7.5安装docker-compose的方法

    yum -y install epel-release && yum install -y python-pip && pip install --upgrade pi ...

  10. stm32 ADC模数转换 ADC多通道 ADC DMA

    通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...