BZOJ3635谈笑风生
一些闲话
这题方法好多啊QAQ,离线有BIT、长链剖分,在线有线段树合并,主席树等。
要我出题绝对不可能放离线过。。。
题面链接
题意简述
简单的看一下题意,就是给定\(a\),求任何一个距\(a\)距离不超过给定的\(k\)的\(b\),然后求一个\(c\)使得是\(a,b\)的后代。
sol
我相信你已经看出来了,\(abc\)在一条直上直下的链上,不过这并没有什么用。我们考虑当\(b\)是\(a\)的祖先时,\(a\)子树内所有除它自己以外的点都可以做\(c\)这个可以直接统计。当\(a\)是\(b\)的祖先时,\(b\)子树内所有除它以外的点都可以做\(c\)。那么每个节点搞一个权值线段树维护一下就可以辣。然后显然这个空间复杂度会爆炸,于是就可以愉快的线段树合并辣。
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
const int N=600005;
std::vector<int>Q[N],id[N];
using std::min;
using std::max;
struct node
{
ll siz;int lc,rc;
}t[N*30];
int tot,opt;
ll query(int L,int R,int l,int r,int x)
{
if(!x)return 0;
if(L<=l&&r<=R)return t[x].siz;
int mid=l+r>>1;ll res=0;
if(mid>=L)res+=query(L,R,l, mid ,t[x].lc);
if(mid< R)res+=query(L,R,mid+1,r,t[x].rc);
return res;
}
void upd(int l,int r,int pos,int &x,int v)
{
if(!x)x=++tot;t[x].siz+=v;
if(l==r)return;
int mid=l+r>>1;
if(mid>=pos)upd(l,mid,pos,t[x].lc,v);
else upd(mid+1,r,pos,t[x].rc,v);
}
int merge(int u,int v,int l,int r)
{
if(!u||!v)return u|v;
int mid=l+r>>1,x=++tot;
t[x].siz=t[u].siz+t[v].siz;
t[x].lc=merge(t[u].lc,t[v].lc,l, mid );
t[x].rc=merge(t[u].rc,t[v].rc,mid+1,r);
return x;
}
int siz[N],rt[N],a[N],b[N],fa[N],head[N],to[N],nxt[N],cnt,sz,dep[N];
ll ans[N];
inline void add(int u,int v)
{
to[++cnt]=v,nxt[cnt]=head[u],head[u]=cnt;
to[++cnt]=u,nxt[cnt]=head[v],head[v]=cnt;
}
void dfs(int u,int pa=0)
{
dep[u]=dep[pa]+1;siz[u]=1;//printf("u=%d pa=%d\n",u,pa);
for(int i=head[u];i;i=nxt[i])
if(to[i]!=pa)
dfs(to[i],u),siz[u]+=siz[to[i]];
upd(1,sz,dep[u],rt[u],siz[u]-1);
if(pa)rt[pa]=merge(rt[pa],rt[u],1,sz);
}
int main()
{
int n=in(),q=in();sz=n;
for(int i=1;i<n;++i)add(in(),in());
dfs(1);
for(int i=1;i<=q;++i)
{
int x=in(),y=in();
printf("%lld\n",query(dep[x]+1,dep[x]+y,1,n,rt[x])+1ll*(siz[x]-1)*min(dep[x]-1,y));
}
return 0;
}
BZOJ3635谈笑风生的更多相关文章
- 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树
3653: 谈笑风生 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 628 Solved: 245[Submit][Status][Discuss] ...
- BZOJ3653: 谈笑风生
Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同节点.如 ...
- 老码农教你在 StackOverflow 上谈笑风生
作为一个高大上的码农,你肯定用到过 StackOverflow,必须的.会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门.StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备 ...
- 数据结构(主席树):COGS 2211. 谈笑风生
2211. 谈笑风生 ★★★★ 输入文件:laugh.in 输出文件:laugh.out 简单对比时间限制:3 s 内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下 ...
- 【NOI模拟】谈笑风生(主席树)
题目描述 设 T 为一棵有根树,我们做如下的定义: 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称 “ a 比 b 不知道高明到哪里去了 ” . 设 a 和 b 为 T 中 ...
- bzoj 3653 [湖南集训]谈笑风生
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
- BZOJ_3653_谈笑风生_树状数组
BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...
- 【BZOJ3653】谈笑风生(长链剖分)
[BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\ ...
- luogu P3899 [湖南集训]谈笑风生
传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...
随机推荐
- ES6的promise函数用法讲解
总结:Promise函数的出现极大的解决了Js中的异步调用代码逻辑编写太过复杂的问题,Promise对象让异步调用函数的流程显得更加的优雅,也更容易编写. 举例: 1. 异步调用: 假设现在我的一个页 ...
- 32bit 天堂2 windows 2003 server架设教程
安装环境::[注意:本教程newauth要用不加密的版本] windows 2003 enterprise server 100用户license Microsoft sql server 2000 ...
- Swing的概述
Swing在Java中是一个包,下面就是它的基本概述:简介: Java为了方便图形界面的实现, 专门设计了类库来满足各种各样的图形元素和用户交互事件, 该类库即为抽象窗口工具箱(Abstract Wi ...
- Dubbo问题处理集合
1 . 启动微服务的时候,报错信息如下: 核心:Can not lock the registry cache file /root/.dubbo/dubbo-registry-127.0.0.1.c ...
- GearCase UI - 自己构建一套基于 Vue 的简易开源组件库
最近 1 ~ 2 月除了开发小程序之外,还一直在继续深入的学习 Vuejs.利用零碎.闲暇的时间整合了一套基于 Vue 的 UI 组件库.命名为 GearCase UI,意为齿轮盒.现在把该项目进行开 ...
- centos7.6 安装 openvpn--2.4.7
openvpn-server端 搭建 1,软件版本 Centos - 7.x easy-rsa - 3.0.3 OpenVPN - 2.4.7 2,安装 建议安装启用epel源,采用yum的方式安装o ...
- ubuntu下import matplotlib错误解决办法
环境:ubuntu16.04,python2.7,tensorflow1.4.0 问题: ImportError: No moudule named _tkinter, please install ...
- mysql添加一个字段(
mysql添加一个字段(在指定的一个字段后面) 举个栗子:alter table inquiry add error_code varchar(3) after add_time; 说明:alter ...
- nmap命令详解
基础命令学习目录 原文链接:http://www.cnblogs.com/hongfei/p/3801357.html Nmap即网络映射器对Linux系统/网络管理员来说是一个开源且非常通用的工具. ...
- Promise.all请求失败重发功能的实现
写爬虫时遇到用Promise.all同时请求多个页面,不可避免的会遇到某些请求失败的情况,这时可以实现一个"重发失败请求"的功能. Promise.all(task).then() ...