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之 ...
随机推荐
- windbg内核诊断方式--转载
一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...
- HDU4836 The Query on the Tree(树状数组&&LCA)
由于智力的问题,百度之星完全lu不动..开场看第一题根据题目给的条件我觉得一定是可以构造出来的,题目给的意思颇有鸽巢原理的感觉,于是觉得开场第一题应该就是智力构造题了,想了半个小时,发现完全想不动,于 ...
- poj 3903 Stock Exchange(最长上升子序列,模版题)
题目 #include<stdio.h> //最长上升子序列 nlogn //入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现 //数组下标从1号开始. int bs ...
- hdu 4352 XHXJ's LIS 数位DP
数位DP!dp[i][j][k]:第i位数,状态为j,长度为k 代码如下: #include<iostream> #include<stdio.h> #include<a ...
- hdu 4345 Permutation 记忆化搜索
思路:实际上求的是和小于等于n的质数的种类数!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorit ...
- Add and Search Word - Data structure design
https://leetcode.com/problems/add-and-search-word-data-structure-design/ Design a data structure tha ...
- JS加载时间线
1.创建Document对象,开始解析web页面.解析HTML元素和他们的文本内容后添加Element对象和Text节点到文档中.这个阶段document.readyState = 'loading' ...
- 8天学通MongoDB——第三天 细说高级操作
原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识,主 ...
- gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
问题: 解决办法: 1.没安装G++ 可使用 sudo apt-get install g++ 进行安装 2.gcc版本和g++版本不相符 可利用gcc -v和g++ -v 查看版本
- 有直接运行的runas命令,XP就有
net user administrator /active:yes runas /user:ComputerName\Administrator /savecred “C:\Path\To\Prog ...