BZOJ 3653 谈笑风生
ORZ blutrex。。。。。。
主席树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 1000500
#define maxq 1000500
#define maxe 1600500
using namespace std;
struct edge
{
long long v,nxt;
}e[maxe];
struct answer
{
long long sum1,sum2;
};
long long n,q,x,y,nume=,g[maxv],size[maxv],dis[maxv],w[maxv],mx[maxv],mxdis=,cnt=,fw[maxv];
long long root[maxv],ls[maxv<<],rs[maxv<<],val1[maxv<<],val2[maxv<<],tot=;
void addedge(long long u,long long v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs(long long x,long long fath)
{
size[x]=;w[x]=++cnt;mx[x]=w[x];fw[cnt]=x;
for (long long i=g[x];i;i=e[i].nxt)
{
long long v=e[i].v;
if (v!=fath)
{
dis[v]=dis[x]+;mxdis=max(mxdis,dis[v]);
dfs(v,x);
size[x]+=size[v];
mx[x]=max(mx[x],mx[v]);
}
}
}
void build(long long &now,long long left,long long right)
{
now=++tot;val1[now]=val2[now]=;
if (left==right) return;
long long mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void modify(long long last,long long &now,long long left,long long right,long long pos,long long x)
{
now=++tot;ls[now]=ls[last];rs[now]=rs[last];
val1[now]=val1[last]+x;val2[now]=val2[last]+;
if (left==right) return;
long long mid=(left+right)>>;
if (pos<=mid) modify(ls[last],ls[now],left,mid,pos,x);
else modify(rs[last],rs[now],mid+,right,pos,x);
}
answer merge(answer x,answer y)
{
answer ret;
ret.sum1=x.sum1+y.sum1;
ret.sum2=x.sum2+y.sum2;
return ret;
}
answer ask(long long last,long long now,long long left,long long right,long long l,long long r)
{
answer ret;
if ((left==l) && (right==r))
{
ret.sum1=val1[now]-val1[last];
ret.sum2=val2[now]-val2[last];
return ret;
}
long long mid=(left+right)>>;
if (r<=mid) return ask(ls[last],ls[now],left,mid,l,r);
else if (l>=mid+) return ask(rs[last],rs[now],mid+,right,l,r);
else return merge(ask(ls[last],ls[now],left,mid,l,mid),ask(rs[last],rs[now],mid+,right,mid+,r));
}
int main()
{
scanf("%lld%lld",&n,&q);
for (long long i=;i<=n-;i++)
{
scanf("%lld%lld",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs(,);
build(root[],,mxdis);
for (long long i=;i<=n;i++)
modify(root[i-],root[i],,mxdis,dis[fw[i]],size[fw[i]]);
for (long long i=;i<=q;i++)
{
scanf("%lld%lld",&x,&y);
long long ret=min(dis[x],y)*(size[x]-);
answer regis=ask(root[w[x]-],root[mx[x]],,mxdis,min(dis[x]+,mxdis),min(dis[x]+y,mxdis));
ret+=regis.sum1-regis.sum2;
printf("%lld\n",ret);
}
return ;
}
BZOJ 3653 谈笑风生的更多相关文章
- BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- 【刷题】BZOJ 3653 谈笑风生
Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". ? 设a 和 b 为 ...
- bzoj 3653 谈笑风生——主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 原来一直想怎么线段树合并.可是不会把角标挪一位. 查询的其实是子树内一段深度的点的 s ...
- bzoj 3653 谈笑风生 —— 主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分: 第一 ...
- BZOJ 3653: 谈笑风生(DFS序+可持久化线段树)
首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不 ...
- bzoj 3653: 谈笑风生 可持久化线段树
题目大意 在一棵单位边权的有根树上支持询问: 给定a,k求满足下列条件的有序三元对的个数. a,b,c互不相同 a,b均为c的祖先 a,b树上距离<=k 题解 solution 1 首先我们知道 ...
- bzoj 3653: 谈笑风生【dfs序+主席树】
考虑b的两种情况,一种是p的祖先,这种点有min(k,de[p]-1)个,然后每个这种b都有si[p]-1个c点可选: 另一种是p的子孙,要求是在p的子树内且deep在de[p]+1~de[p]+k之 ...
随机推荐
- ZOJ 2971 Give Me the Number;ZOJ 2311 Inglish-Number Translator (字符处理,防空行,strstr)
ZOJ 2971 Give Me the Number 题目 ZOJ 2311 Inglish-Number Translator 题目 //两者题目差不多,细节有点点不一样,因为不是一起做的,所以处 ...
- Andoid自动判断输入是电话,网址或者Email的方法----Linkify的应用!
本节要讲的是,当我们在一个EditText输入电话或者网址还是Email的时候,让Android自动判断,当我们输入的是电话,我们点击输入内容将调用打电话程序,当我们输入是网址点击将打开浏览器程序.而 ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
- C++ std命名空间
1.命名空间是一种特殊的作用域,它包含了处于该作用域中所有标示符.命名空间使用namespace 来声明,并使用{}来界定命名空间的作用域,例如: namespace func{ int val=0; ...
- Spring REST for DELETE Request Method Not Supoorted
http://stackoverflow.com/questions/22055251/sending-data-with-angularjs-http-delete-request I have a ...
- 基于RPC原理的dubbo
在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...
- ios开发分类--NSDate+Helpers
#import <Foundation/Foundation.h> @interface NSDate (Helpers) @end #import "Date.h" ...
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-003Table per concrete class with unions(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)、<union-subclass>)
一.代码 1. package org.jpwh.model.inheritance.tableperclass; import org.jpwh.model.Constants; import ja ...
- 使用 JAX-RS 简化 REST 应用开发
本文将详细介绍 Java EE 6 中所引入的对 JSR-311 (JAX-RS : Java API for RESTful Web Services) 的支持,并通过一个完整的示例应用程序展示 J ...
- CentOS下支持exFAT与NTFS
exFAT: 1.下载fuse-exfat支持软件: exfat支持是通过fuse模块的方式支持的,其项目地址是: https://code.google.com/p/exfat/ ,当前版本是:1. ...