wannafly挑战赛4树的距离 离线处理,dfs序
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行一个正整数N
接下来N-1描述这棵树,每行两个数第i行两个数p和D表示树上有一条p到i+1长度为D的边。(p<=i)
下面一行一个正整数Q表示wyf的询问次数。
接下来Q行每行两个正整数x和k。 (1<=N,Q<=2x105,1<=D,K<=106)
输出描述:
对于每次询问x,k输出以x为根的子树上,所有与x距离大于等于k的点与x的距离之和。(若不存在这样的点,则输出应为0)
输入例子:
3
1 2
1 3
2
1 3
1 2
输出例子:
3
5
-->
输入
3
1 2
1 3
2
1 3
1 2
输出
3
5

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+88;
long long ans[N];
int tot,head[N],pos[N],kt,lt[N];
struct cta{
int next,to,w;
}e[N<<1];
struct node{
int num,l,r;
long long sum;
}tr[N<<2];
struct qqq{
int id,rto;
long long k;
bool operator <(const qqq &A)const{
return k>A.k;
}
}qt[N];
struct ttt{
long long dis;
int id;
bool operator < (const ttt &B)const{
return dis>B.dis;
}
}dt[N];
void add(int u,int v,int w) {
e[tot].to=v;e[tot].next=head[u];e[tot].w=w;head[u]=tot++;
}
void build(int l,int r,int rt){
tr[rt].l=l,tr[rt].r=r;
tr[rt].sum=tr[rt].num=0;
if(l==r) return;
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
}
void dfs(int u,long long now,int f){
pos[u]=++kt;
for(int i=head[u];~i;i=e[i].next) {
if(e[i].to==f) continue;
else dfs(e[i].to,dt[e[i].to].dis=e[i].w+now,u);
}
lt[u]=kt;
}
void modify(int pos,int rt,int cc){
int l=tr[rt].l,r=tr[rt].r;
int mid=(l+r)>>1;
if(l==r) {
tr[rt].num=1;
tr[rt].sum+=dt[cc].dis;
return;}
if(pos<=mid) modify(pos,rt<<1,cc);
else modify(pos,rt<<1|1,cc);
tr[rt].num=tr[rt<<1].num+tr[rt<<1|1].num;
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}
long long query(int L,int R,int rt,long long &cty){
long long now=0;
if(L>R) return 0;
int l=tr[rt].l,r=tr[rt].r;
if(L<=l&&R>=r) {cty+=tr[rt].num; return tr[rt].sum;}
int mid=(l+r)>>1;
if(mid>=L) now+=query(L,R,rt<<1,cty);
if(mid<R) now+=query(L,R,rt<<1|1,cty);
return now;
}
int tran[N];
int main(){
int n,x,y,m;
memset(head,-1,sizeof(head));
tot=kt=0;
scanf("%d",&n);
build(1,n,1);
for(int i=2;i<=n;++i) {
scanf("%d%d",&x,&y);
add(x,i,y);
add(i,x,y);
}
dfs(1,0,0);
for(int i=1;i<=n;++i) dt[i].id=i;
scanf("%d",&m);
for(int i=1;i<=m;++i) {
scanf("%d%lld",&qt[i].rto,&qt[i].k);
qt[i].id=i;
qt[i].k+=dt[qt[i].rto].dis;
}
sort(qt+1,qt+1+m);
sort(dt+1,dt+n+1);
int r=1;
for(int i=1;i<=n;++i) tran[dt[i].id]=i;
for(int i=1;i<=m;++i) {
long long now=0;
for(;r<=n;++r) if(!(dt[r].dis>=qt[i].k)) break;else modify(pos[dt[r].id],1,r);
ans[qt[i].id]=query(pos[qt[i].rto]+1,lt[qt[i].rto],1,now);
ans[qt[i].id]-=now*dt[tran[qt[i].rto]].dis;
}
for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
}
wannafly挑战赛4树的距离 离线处理,dfs序的更多相关文章
- newcoder Wannafly挑战赛4 树的距离
https://www.nowcoder.com/acm/contest/35/D 假设要查询x的子树中,与x的距离>=y的距离和 那么如果有这么一个 由x的子树中的点到x的距离构成的序列,且按 ...
- 【bzoj4771】七彩树 树链的并+STL-set+DFS序+可持久化线段树
题目描述 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义 ...
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ4530 BJOI2014大融合(线段树合并+并查集+dfs序)
易知所求的是两棵子树大小的乘积.先建出最后所得到的树,求出dfs序和子树大小.之后考虑如何在动态加边过程中维护子树大小.这个可以用树剖比较简单的实现,但还有一种更快更优美的做法就是线段树合并.对每个点 ...
- bzoj4817/luogu3703 树点涂色 (LCT+dfs序+线段树)
我们发现,这个染色的操作他就很像LCT中access的操作(为什么??),然后就自然而然地想到,其实一个某条路径上的颜色数量,就是我们做一个只有access操作的LCT,这条路径经过的splay的数量 ...
- BZOJ.4817.[SDOI2017]树点涂色(LCT DFS序 线段树)
题目链接 操作\(1.2\)裸树剖,但是操作\(3\)每个点的答案\(val\)很不好维护.. 如果我们把同种颜色的点划分到同一连通块中,那么向根染色的过程就是Access()! 最初所有点间都是虚边 ...
- 沈阳网络赛J-Ka Chang【分块】【树状数组】【dfs序】
Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero point. Then, ...
- 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解
这一题是对AC自动机的充分理解和树dfs序的巧妙运用. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和' ...
- 【树链剖分】【dfs序】【线段树】bzoj2836 魔法树
这道题告诉我们:树链剖分的重标号就是dfs序. #include<cstdio> #include<algorithm> using namespace std; #defin ...
随机推荐
- T-SQL字符串函数
整理下MSSQL中有关时间的函数,博客记录之. ASCII 原型:ASCII ( character_expression ) 返回值:int 类型值 功能:返回输入字符串最左边的一个字符的ASCII ...
- (转)如何学好C语言
原文:http://coolshell.cn/articles/4102.html 作者:陈皓 有人在酷壳的留言版上询问下面的问题 keep_walker : 今天晚上我看到这篇文章. http ...
- 【深入AQS原理】我画了35张图就是为了让你深入 AQS
申明 本文首发自公众号:程序员cxuan,此文章为本人投稿文章.已经和cxuan沟通,文章投递公众号,博客平台我自己发布可标记为原创. 此文章肝了很久,图片较多,希望大家喜欢. 另外,感兴趣的小伙伴可 ...
- Linux监听磁盘使用情况
前阵子服务器磁盘写满了,导致项目出了很多奇怪的问题,比如文件上传不了(这个很好理解),还有登录时验证码无法加载(现在依旧不知道原因,项目的验证码图片是只在内存中生成的BufferedImage对象,不 ...
- 二.Spring boot食用指南:结合Jpa(Hibernate) 构建MVC架构
1.POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- 是时候实现 SOC 2.0 了
本文讲的是是时候实现 SOC 2.0 了,SOC,安全运营中心,为取得其最佳效果,以及真正最小化网络风险,需要全员就位,让安全成为每个人的责任. 早在几年前,企业就开始创建SOC来集中化威胁与漏洞的监 ...
- Xapian实战(二):core concepts
参考资料 core concepts 正文 1. 并发性 xapian不包含任何全局变量,所以多线程编程中,在没有共享资源的情况下可以安全使用xapian.在实际操作中,由于每个线程都可以创建自己的x ...
- Java自动装箱与缓存
自动装箱与缓存 现象 有以下代码: 1 public class Main { 2 public static void main(String[] args) { 3 Integer i1 = 12 ...
- RocketMQ搭建全过程
RocketMQ下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.3.0/rocketmq-all-4.3.0-bin-relea ...
- Dynamics 365 基于 Sql Server 2017 安装 报表 问题
如果使用SQL2017 安装D365 会发现 SSRS与AD不能在同一台服务器上,因为无法安装SSRS,而无SSRS 则D365是无法继续安装的. 所以解决方法有二个: 1.另外准备一台服务器,不需要 ...