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 ...
随机推荐
- css 学习笔记 常用到的知识
做 loading 居中 剧中通常就是 top left 50% 再调一下自己就可以了 关键是要有 width height 遇到一些base on content 决定 height 的情况一般上有 ...
- sql过程的条件是IN,用脚本执行
DECLARE @sql nvarchar(); DECLARE @inStr nvarchar(); SET @inStr='''条件1'',''条件2'''; set @sql='SELECT * ...
- MySql翻页查询
分页查询在网页中随处可见,那原理是什么呢?下面简单介绍一下基于MySql数据库的limit实现方法. 首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会 ...
- Spring3.2.2中相关Jar包的作用
今天在看Spring的源码的时候不知道从什么地方开启应该合适,因为不太清楚实现类所在的具体Jar包,就从网上找了些,可是网上有的说的是不清不楚,甚至是有些错误的,所以就把相关Jar包的大致作用给整理了 ...
- gitlab自动化部署CI案例
参考: https://blog.csdn.net/hxpjava1/article/details/78514999 (简单操作) https://blog.csdn.net/wh211212/ ...
- matplotlib基本函数
数据分析 matlab Numpy + scipy + pandas +matplotlib 数据计算 +科学应用+数据清洗+数据可视化 1 Numpy概述 1 基于c语言的python接口的数值算法 ...
- navicat for oracle 导入xlsx文件提示无法打开xlsx文件
navicat for oracle 导入xlsx文件提示:无法打开xlsx文件 导入环境: navicat for oracle wps状态的xlsx文件 处理: 将wps状态的xlsx文件,打开方 ...
- Metasploit Penetration (第一夜加班)
1.最近白天瞒着上班,晚自习看英语,还要瞒着写论文(现在是看,之前的部分章节被老师否定了,现在开始要从新进行整理)所以只有这晚上来开始看我的渗透测试了,发现渗透的很多知识,只要你平时不用很快就会生疏, ...
- rsync & sersync 实时同步
1.根据之前一篇关于rsync的随笔部署好rsync服务后,可以开始inotify的部署 2.sersync的部署 ①.部署服务(安装和配置过程) #Master 部署Sersync服务 mkdir ...
- LINQ图解教程
LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…where片段 from子句let子句w ...