bzoj 3653: 谈笑风生【dfs序+主席树】

时间:2022-06-25 06:48:02

考虑b的两种情况,一种是p的祖先,这种点有min(k,de[p]-1)个,然后每个这种b都有si[p]-1个c点可选;

另一种是p的子孙,要求是在p的子树内且deep在de[p]+1~de[p]+k之间,然后一个这样的b点贡献是si[b]-1,也就是在他的子树内选c点,考虑怎么算这个,用dfs序维护,这样每次查p的子树就是一段区间了,然后用主席树按deep维护每个点的size-1,就可以直接查了

#include<iostream>
#include<cstdio>
using namespace std;
const int N=300005;
int n,q,h[N],cnt,de[N],si[N],l[N],r[N],con,a[N],rt[N],tot;
struct qwe
{
int ne,to;
}e[N<<1];
struct zxs
{
int ls,rs;
long long s;
}t[20000005];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void dfs(int u,int fa)
{
a[++con]=u;
l[u]=con;
si[u]=1;
de[u]=de[fa]+1;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa)
{
dfs(e[i].to,u);
si[u]+=si[e[i].to];
}
r[u]=con;
}
void ins(int &ro,int la,int l,int r,int x,int v)
{
ro=++tot;
t[ro]=t[la];
t[ro].s+=v;
if(l==r)
return;
int mid=(l+r)>>1;
if(x<=mid)
ins(t[ro].ls,t[la].ls,l,mid,x,v);
else
ins(t[ro].rs,t[la].rs,mid+1,r,x,v);
}
long long ques(int ro,int la,int l,int r,int ll,int rr)
{
if(ll>rr)
return 0;
if(l==ll&&r==rr)
return t[ro].s-t[la].s;
int mid=(l+r)>>1;
if(rr<=mid)
return ques(t[ro].ls,t[la].ls,l,mid,ll,rr);
else if(ll>mid)
return ques(t[ro].rs,t[la].rs,mid+1,r,ll,rr);
else
return ques(t[ro].ls,t[la].ls,l,mid,ll,mid)+ques(t[ro].rs,t[la].rs,mid+1,r,mid+1,rr);
}
int main()
{
n=read(),q=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++)
ins(rt[i],rt[i-1],1,n,de[a[i]],si[a[i]]-1);
while(q--)
{
int p=read(),k=read();
printf("%lld\n",1ll*min(k,de[p]-1)*(si[p]-1)+ques(rt[r[p]],rt[l[p]-1],1,n,de[p]+1,min(de[p]+k,n)));
}
return 0;
}

bzoj 3653: 谈笑风生【dfs序+主席树】的更多相关文章

  1. BZOJ 3653&colon; 谈笑风生&lpar;DFS序&plus;可持久化线段树&rpar;

    首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不 ...

  2. dfs序&plus;主席树 或者 树链剖分&plus;主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  3. 2018&period;09&period;30 bzoj3551&colon;Peaks加强版(dfs序&plus;主席树&plus;倍增&plus;kruskal重构树)

    传送门 一道考察比较全面的题. 这道题又用到了熟悉的kruskal+倍增来查找询问区间的方法. 查到询问的子树之后就可以用dfs序+主席树统计答案了. 代码: #include<bits/std ...

  4. 【bzoj3545&sol;bzoj3551】&lbrack;ONTAK2010&rsqb;Peaks&sol;加强版 Kruskal&plus;树上倍增&plus;Dfs序&plus;主席树

    bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...

  5. 【bzoj1803】Spoj1487 Query on a tree III DFS序&plus;主席树

    题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...

  6. BZOJ 3439&colon; Kpm的MC密码 &lpar;trie&plus;dfs序主席树&rpar;

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

  7. &lbrack;xdoj1216&rsqb;子树第k小&lpar;dfs序&plus;主席树&rpar;

    解题关键:dfs序将树映射到区间,然后主席树求区间第k小,为模板题. #pragma comment(linker, "/STACK:1024000000,1024000000") ...

  8. BZOJ 2819&colon; Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  9. bzoj 3439 Kpm的MC密码(Trie&plus;dfs序&plus;主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

随机推荐

  1. 酷酷的CSS3三角形运用

    概述 在早期的前端Web设计开发年代,完成一些页面元素时,我们必须要有专业的PS美工爸爸,由PS美工爸爸来切图,做一些圆角.阴影.锯齿或者一些小图标. 在CSS3出现后,借助一些具有魔力的CSS3属性 ...

  2. 01scala环境搭建和基础

    1.环境搭建 1.下载安装jdk1.7以上版本,并进行环境变量的配置 2.下载scala-2.10.4.msi,安装后进行环境变量的配置 3.下载scala-SDK-4.1.1-vfinal-2.11 ...

  3. python中的pth文件作用

    python中有一个.pth文件,该文件的用法是: 首先xxx.pth文件里面会书写一些路径,一行一个. 将xxx.pth文件放在特定位置,则可以让python在加载模块时,读取xxx.pth中指定的 ...

  4. 什么是 docker?

    关于 Docker 是什么,有个著名的隐喻:集装箱.但是它却起了个“码头工人”( docker 的英文翻译)的名字.这无疑给使用者很多暗示:“快来用吧!用了 Docker ,就像世界出现了集装箱,这样 ...

  5. 一起学习iOS开发专用词汇,每天记3个,助你变大牛

    大家做开发最大的问题是什么?英语的问题应该困扰很多的同学的地方,我们提倡科学学习开发中的常用词汇.我们不要求大家有特别好的听.说.写,只要能够记住,能够认识这些常用词汇你以后的开发也将游刃有余.我们的 ...

  6. 容器如何访问外部世界?- 每天5分钟玩转 Docker 容器技术(36)

    前面我们已经解决了容器间通信的问题,接下来讨论容器如何与外部世界通信.这里涉及两个方向: 容器访问外部世界 外部世界访问容器 容器访问外部世界 在我们当前的实验环境下,docker host 是可以访 ...

  7. 使用svn创建分支&excl;

    1 在主分支上 右键svn---选中 branch/Tag选项 2,填写新分支目录之后 点击 ok键 3,在新创建的分支目录 右键 --> Chenckout下  就可以把代码拉下来了 4.更新 ...

  8. 【题解】JSOIWC2019 Round1

    题面(T1变成5s(毒瘤出题人发现std超时了qaq)): 啥都不会qaq.但也送了不少分 题解: T1: 当T=0时直接异或前缀和,但T=1时就有点恶心 暴力能有80pts(防止大家爆零) 还珂以用 ...

  9. gson解析json

    json介绍 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本 ...

  10. 百度图片http&colon;&sol;&sol;img&lbrack;0-9&rsqb;&bsol;&period;imgtn&period;&ast;&quest;g此形式的链接图片下载方式

    """给出图片链接列表, 下载图片""" print(pic_urls) for pic_url in pic_urls: try: hos ...