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\)祖先,那么答案为 ...
随机推荐
- Mac os x 配置maven
安装Maven 1.压缩包apache-maven-3.3.9-bin.zip 2.解压压缩包到指定文件 3.打开终端,输入以下命令,编辑环境变量文件:bash_proflie open .bash_ ...
- SQL查询语句大全及其理解
转自:https://www.cnblogs.com/1234abcd/p/5530314.html 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删 ...
- Stack Overflow访问问题的处理
一直以来都有访问stackoverflow的习惯,但是老是因为js的问题让人很多操作都操作不了,而且打开的速度也很慢. 原因其实就是stackoverflow使用的google的cdn,于是想彻底一点 ...
- 新手Python第四天(生成器)
Python 生成器 生成器和生成表达式 a=[i*2 for i in range(10)]#生成表达式 b=(i*2 for i in range(10))#生成器 生成器的特点:优点(不占用内存 ...
- 如何批量删除QQ浏览器指定历史记录和导出指定的历史记录
QQ浏览器的历史记录只有清空历史记录和删除选中项两个功能.有时我不想删除所有的历史记录,只是想删除指定的历史记录保留对自己有用的历史记录,方便自己以后查找.但是删除选中项功能只能一项一项的选择,才能批 ...
- python3 通过qq邮箱定时发送邮件
下面的代码为了每天定时发送监控邮件,监控什么呢?监控当天redis队列中是否有没有消费的数据,和当天mysql中新增的数据量 # -*- coding:utf-8 -*- from common.re ...
- ftp部署及使用
常用软件安装及使用目录 http://www.jb51.net/article/106604.htm ftp部署 本篇文章主要介绍了CentOS7.0下安装FTP服务的方法,小编觉得挺不错的,现在 ...
- 20172308 实验一《Java开发环境的熟悉》实验报告
20172308 2017-2018-2 <程序设计与数据结构>实验1报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...
- servlet几个常用的方法
servlet继承了HTTPServlet所以可以重写父类的方法,下面一 一介绍方法Dopost DoGet 比较常用不再介绍. 一.Init(),和Init(ServletConfig config ...
- SpringMVC运行原理浅析
SpringMVC是主流的J2EEWEB层框架,SpringMVC是Sping家族中一个重要的产品.下面给出SpringMVC的运行原理.springmvc和spring无需通过中间层进行整合,spr ...