HDU 3078 倍增LCA+排序
来源:互联网 发布:a股b股h股n股s股 知乎 编辑:程序博客网 时间:2024/05/27 00:48
题意:n个点,n-1条边构成无向树,每个节点有权,Q次询问,每次或问从a->b的最短路中,权第k大的值,或者更新节点a的权。
分析:首先倍增LCA预处理出祖先,然后暴力查找排序即可,水题。。。
代码:
#pragma comment(linker,"/STACK:102400000,102400000")#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <math.h>#include <queue>#include <stack>#include <map>#include <set>using namespace std;typedef long long ll;const int M=30;const int maxn=100005;const int maxm=200005;struct EdgeNode{ int to; int next;}edge[maxm];int head[maxn],cnt,root;void add(int x,int y){ edge[cnt].to=y; edge[cnt].next=head[x]; head[x]=cnt++;}int fa[maxn][M],deep[maxn],zhi[maxn],s[maxn];void init(){ cnt=0; memset(head,-1,sizeof(head)); memset(deep,-1,sizeof(deep)); memset(fa,0,sizeof(fa));}void dfs(int pre,int u) //预处理{ deep[u]=deep[pre]+1; fa[u][0]=pre; for(int i=1;i<M;i++)fa[u][i]=fa[fa[u][i-1]][i-1]; //预处理出祖先 for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(v!=pre)dfs(u,v); }}int LCA(int u,int v){ if(deep[u]<deep[v])swap(u,v); int d=deep[u]-deep[v]; for(int i=0;i<M;i++)if((1<<i)&d)u=fa[u][i]; //走到同一层 if(u==v)return u; for(int i=M-1;i>=0;i--) //二分计算LCA { if(fa[u][i]!=fa[v][i]) { u=fa[u][i]; v=fa[v][i]; } } u=fa[u][0]; return u;}void solve(int t,int x,int y,int k){ int ans=0; s[ans++]=zhi[x]; s[ans++]=zhi[y]; while(x!=t&&y!=t) { if(deep[x]>deep[y]){ x=fa[x][0]; s[ans++]=zhi[x]; } else{ y=fa[y][0]; s[ans++]=zhi[y]; } } sort(s,s+ans); printf("%d\n",s[ans-k]);}int main(){ int i,x,y,k,ans,n,m; while(~scanf("%d%d",&n,&m)) { init(); for(i=1;i<=n;i++)scanf("%d",&zhi[i]); for(i=1;i<n;i++){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(-1,1); for(i=1;i<=m;i++){ scanf("%d%d%d",&k,&x,&y); if(k==0)zhi[x]=y; else{ if(y==0||y>n){printf("invalid request!");continue;} int t=LCA(x,y); if(deep[x]+deep[y]-2*deep[t]+1<k)printf("invalid request!\n"); else{ solve(t,x,y,k); } } } } return 0;}
0 0
- HDU 3078 倍增LCA+排序
- hdu 3078 Network(lca 倍增)
- HDU 4547 倍增LCA
- hdu 3078 (LCA+排序)
- hdu 3078(LCA+排序)
- HDU 3078 Network LCA + 排序
- hdu 4549 CD操作(lca倍增法)
- hdu 4674 (缩点 + 倍增LCA)
- ACM LCA 倍增 模板 HDU 5044
- hdu 4547 CD操作 LCA倍增算法
- hdu 4822 Tri-war(LCA倍增)
- HDU 6115 Factory(在线倍增LCA)
- hdu 5296 lca+dfs应用,lca倍增法模板
- lca倍增
- lca(倍增)
- 倍增LCA
- 倍增lca
- LCA倍增
- 按钮onclick事件大全
- 线性回归分析中的哑变量
- Mahout安装尝试
- Ubuntu12.04从桌面进入终端Terminal的方式
- hihoCoder1051 - 补提交卡
- HDU 3078 倍增LCA+排序
- hdu 2586 lca离线tarjan
- Linux文件类型解析
- configure的制作
- 1.1 解压序列到多个变量
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第8章节--配送SP2013Apps 总结
- leetcode 虐我篇之(二十)Search Insert Position
- cocos2d_x_01_环境搭建
- Dinic+当前弧优化