【BZOJ】【P4281】【ONTAK2015】【Związek Harcerstwa Bajtockiego】【题解】【倍增】
2015-10-17 20:56
381 查看
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4281
反正已经没有人来这里了……我想怎么BB就怎么BB……aha
倍增树剖水题一道……拿来敲敲键盘
这么水为什么还没有多少人做……现在的年轻人都不刷bzoj吗?
跪求哪个偶尔光顾这里的年轻人告诉我这个老头你们都在做哪个OJ
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
const int BIT=20;
int n,m,k;
int fa[maxn][BIT],dep[maxn];
vector<int>G[maxn];
void dfs(int u){
for(int i=1;i<BIT;i++)if(fa[u][i-1])
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(fa[u][0]!=v){
fa[v][0]=u;dep[v]=dep[u]+1;
dfs(v);
}
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int d=dep[u]-dep[v];
for(int i=BIT-1;i>=0;i--)if(d>>i&1)
u=fa[u][i];
if(u==v)return u;
for(int i=BIT-1;i>=0;i--)if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
int dis(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int ans=0;
int d=dep[u]-dep[v];
for(int i=BIT-1;i>=0;i--)if(d>>i&1)
u=fa[u][i],ans+=1<<i;
if(u==v)return ans;
for(int i=BIT-1;i>=0;i--)if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i],ans+=(1<<i)*2;
return ans+2;
}
int up(int x,int d){
for(int i=BIT-1;i>=0;i--)if(d>>i&1)x=fa[x][i];
return x;
}
int now;
int in(){
int r=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))r=r*10+c-'0',c=getchar();
return r;
}
int main(){
scanf("%d%d%d",&n,&now,&m);
for(int i=1;i<n;i++){
int u=in(),v=in();
G[u].push_back(v);
G[v].push_back(u);
}dfs(1);
while(m--){
int d,t,D;
t=in();d=in();
d=min(d,n);
int LCA=lca(now,t);
if(dis(now,t)<=d){
printf("%d",now=t);
}else
if((D=dis(now,LCA))>d){
printf("%d",now=up(now,d));
}else{
printf("%d",now=up(t,dis(LCA,t)-(d-D)));
}
if(m==-1)puts("");else putchar(' ');
}
return 0;
}
反正已经没有人来这里了……我想怎么BB就怎么BB……aha
倍增树剖水题一道……拿来敲敲键盘
这么水为什么还没有多少人做……现在的年轻人都不刷bzoj吗?
跪求哪个偶尔光顾这里的年轻人告诉我这个老头你们都在做哪个OJ
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
const int BIT=20;
int n,m,k;
int fa[maxn][BIT],dep[maxn];
vector<int>G[maxn];
void dfs(int u){
for(int i=1;i<BIT;i++)if(fa[u][i-1])
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(fa[u][0]!=v){
fa[v][0]=u;dep[v]=dep[u]+1;
dfs(v);
}
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int d=dep[u]-dep[v];
for(int i=BIT-1;i>=0;i--)if(d>>i&1)
u=fa[u][i];
if(u==v)return u;
for(int i=BIT-1;i>=0;i--)if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
int dis(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int ans=0;
int d=dep[u]-dep[v];
for(int i=BIT-1;i>=0;i--)if(d>>i&1)
u=fa[u][i],ans+=1<<i;
if(u==v)return ans;
for(int i=BIT-1;i>=0;i--)if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i],ans+=(1<<i)*2;
return ans+2;
}
int up(int x,int d){
for(int i=BIT-1;i>=0;i--)if(d>>i&1)x=fa[x][i];
return x;
}
int now;
int in(){
int r=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))r=r*10+c-'0',c=getchar();
return r;
}
int main(){
scanf("%d%d%d",&n,&now,&m);
for(int i=1;i<n;i++){
int u=in(),v=in();
G[u].push_back(v);
G[v].push_back(u);
}dfs(1);
while(m--){
int d,t,D;
t=in();d=in();
d=min(d,n);
int LCA=lca(now,t);
if(dis(now,t)<=d){
printf("%d",now=t);
}else
if((D=dis(now,LCA))>d){
printf("%d",now=up(now,d));
}else{
printf("%d",now=up(t,dis(LCA,t)-(d-D)));
}
if(m==-1)puts("");else putchar(' ');
}
return 0;
}
相关文章推荐
- Chapter 1 The Role of Algorithms in Computing
- google在线测试练习2
- 使用Google地图
- Golang学习笔记:语言规范二
- hdu-1055----树染色问题color a tree(贪心)
- 9 Special Pythagorean triplet - Project Euler
- 基于Golang的游戏服务器框架cellnet开发日记(二)
- 对golang服务器开发模式的一些思考
- Django1.8特性
- Golang学习笔记:语言规范之声明与作用域
- LSGO软件技术团队对外技术交流
- Django
- Django1.8 关于 静态文件配置
- Go语言是彻底的面向组合的并发语言
- setVisibility(View.GONE)无效的解决方案
- Golang学习笔记:语言规范之类型(续)
- 搜索引擎的搜索技巧——如何利用浏览器精准搜索(科普文)
- pd的django To Do List教程-----3:模板的建立
- Lumen 配合使用Dingo/Api的问题。
- mac修改hosts访问google