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之 ...
随机推荐
- JavaScript面向对象+Array的用法及字符串组合+动态建立锚点
脚本部分: function school(sName,sDddress,sPhone,sMail) { this.SName = sName; this.SAddress = sDddress; t ...
- 调用MYSQL存储过程实例
PHP调用MYSQL存储过程实例 http://blog.csdn.net/ewing333/article/details/5906887 http://www.cnblogs.com/kkchen ...
- Linux :Can't start up: not enough memory
http://stackoverflow.com/questions/9634577/linux-cant-start-up-not-enough-memory
- CString,string,char*之间的转换(转)
这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的:char*是从学习C语 ...
- POJ 3177 Redundant Paths(Tarjan)
题目链接 题意 : 一个无向连通图,最少添加几条边使其成为一个边连通分量 . 思路 :先用Tarjan缩点,缩点之后的图一定是一棵树,边连通度为1.然后找到所有叶子节点,即度数为1的节点的个数leaf ...
- [转载] Linux poll机制
原地址:http://hongwazi.blog.163.com/blog/#m=0&t=3&c=poll poll的是一种查询的方式,英文解释 :民意调查 函数原型:int poll ...
- QT程序探测所需DLL,静态连接和打包
1. 如果没有使用静态编译的QT库的话,那么无论VS还是MinGW编译出来的exe程序都要带上一堆DLL,而且必须是准确版本的DLL,对于VS好像还有一个Microsoft.VC90.CRT.mani ...
- JS解析json数据
JS解析json数据(如何将json字符串转化为数组) 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q ...
- 【查找结构5】多路查找树/B~树/B+树
在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...
- CentOS7-64bit 编译 Hadoop-2.5.0,并分布式安装
摘要 CentOS7-64bit 编译 Hadoop-2.5.0,并分布式安装 目录[-] 1.系统环境说明 2.安装前的准备工作 2.1 关闭防火墙 2.2 检查ssh安装情况,如果没有则安装ssh ...