HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树
lca的做法还是非常明显的。简单粗暴,
只是不是正解。假设树是长链就会跪,直接变成O(n)、、
最后跑的也挺快,出题人还是挺阳光的。。
动态树的解法也是听别人说能ac的。预计就是放在splay上剖分一下,做法还是比較复杂的。,,
来一发lca:
- #include <stdio.h>
- #include <iostream>
- #include <algorithm>
- #include <sstream>
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #include <string>
- #include <time.h>
- #include <math.h>
- #include <queue>
- #include <stack>
- #include <set>
- #include <map>
- using namespace std;
- #define INF 0x3f3f3f3f
- #define eps 1e-8
- #define pi acos(-1.0)
- typedef long long ll;
- const int maxn=20010;
- int head[maxn],tol,dp[maxn],fa[maxn][20],dep[maxn],weight[maxn];
- struct Edge{
- int next,to;
- Edge(int _next=0,int _to=0){
- next=_next;to=_to;
- }
- }edge[10*maxn];
- void addedge(int u,int v){
- edge[tol]=Edge(head[u],v);
- head[u]=tol++;
- }
- void bfs(int s){
- queue<int> q;
- dep[s]=0,fa[s][0]=s;
- q.push(s);
- while(!q.empty()){
- int u=q.front();
- q.pop();
- for(int i=1;i<20;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==fa[u][0])continue;
- fa[v][0]=u;
- dep[v]=dep[u]+1;
- q.push(v);
- }
- }
- }
- int LCA(int x,int y){
- if(dep[x]<dep[y])swap(x,y);
- for(int i=19;i>=0;i--)if((1<<i)&(dep[x]-dep[y]))x=fa[x][i];
- if(x==y)return x;
- for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
- return fa[x][0];
- }
- void dfs(int u,int pre){
- dp[u]=weight[u];
- for(int i=head[u];i!=-1;i=edge[i].next){
- int v=edge[i].to;
- if(v==pre)continue;
- dfs(v,u);
- dp[u]+=dp[v];
- }
- }
- int move(int x,int d){
- for(int i=19;i>=0;i--)
- if(d&(1<<i))x=fa[x][i];
- return x;
- }
- int main()
- {
- int T;
- cin>>T;
- for(int t=1;t<=T;t++){
- int n;
- scanf("%d",&n);
- memset(head,-1,sizeof(head));tol=0;
- for(int i=1;i<n;i++){
- int x,y;
- scanf("%d%d",&x,&y);
- addedge(x,y);
- addedge(y,x);
- }
- bfs(1);
- for(int i=1;i<=n;i++)scanf("%d",&weight[i]);
- dfs(1,-1);
- printf("Case #%d:\n",t);
- int Q;
- scanf("%d",&Q);
- int root=1;
- while(Q--){
- char op[10];
- int x,y;
- scanf("%s",op);
- if(op[0]=='R'){
- scanf("%d",&x);
- root=x;
- }
- else if(op[0]=='C'){
- scanf("%d%d",&x,&y);
- int dd=x;
- while(1){
- dp[dd]+=y-weight[x];
- if(dd==1)break;
- dd=fa[dd][0];
- }
- weight[x] = y;
- }
- else {
- scanf("%d",&x);
- if(x==root)printf("%d\n",dp[1]);
- else {
- int lca=LCA(x,root);
- if(lca==x){
- int p=move(root,dep[root]-dep[x]-1);
- //cout<<"han "<<x<<" "<<root<<" "<<dep[root]-dep[x]-1<<endl;cout<<"p="<<p<<endl;
- printf("%d\n",dp[1]-dp[p]);
- }
- else printf("%d\n",dp[x]);
- }
- }
- }
- }
- return 0;
- }
正解应该是树状数组维护欧拉序列,,
bit的神牛教的。,
详见:点击打开链接
HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树的更多相关文章
- hdu 4836 The Query on the Tree(线段树or树状数组)
The Query on the Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- HDU 2814 斐波那契循环节 欧拉降幂
一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...
- HDU 2586(LCA欧拉序和st表)
什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...
- HDU 4676 Sum Of Gcd 【莫队 + 欧拉】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...
- Apple Tree POJ - 3321 dfs序列构造树状数组(好题)
There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...
- 【HDU 6191】Query on A Tree 【可持久化字典树】
题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这 ...
- HDU 1116 Play on Words(有向欧拉判断)
题目链接 题意:给出一些单词,问全部单词能否首尾相连 直接 将每一个单词第一个和最后一个字母建立一条有向边,保证除了首尾两个出入度不相等,其他的要保证相等.还有一个条件就是 首尾两个出入度差为1 同时 ...
- hdu 1286:找新朋友(数论,欧拉函数)
找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Longest Substring Without Repeating Characters - 哈希与双指针
题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串. 其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串.这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实 ...
- Web Api Route 注册要放在 Mvc Route 注册前
今天想研究一下Web Api,写了一个测试Api,打开网站后浏览一下,可是却提示找不到方法,刚开始以为哪里配置错了,可找了半天也没见. 因为我是在一个现有Mvc站点做的Demo,所以打算新建一个Mvc ...
- Qt浅译:JSON Support in Qt(JSON只有六种数据类型)
JSON Support in Qt Qt5之后开始提供对处理JSON数据的支持,JSON是一种Interter数据交换的数据格式. JSON 用于存储结构化的数据,JSON有6种基本数据类型 ...
- Android 一个改进的okHttp封装库
一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...
- Netflix
2009年Netflix举办了一场Netflix大奖赛.他们公开一批匿名数据,允许参赛团队使用以得出更好的算法.他们从获胜的团队中得到了现有算法10.06%的提升.Netflix本想再举行一场Netf ...
- Hadoop Hive与Hbase整合+thrift
Hadoop Hive与Hbase整合+thrift 1. 简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...
- libpng causes error concerning pngconf.h
Bug Description Ubuntu Gutsy Gibbon 7.10 - libpng 1.2.15~beta5-2ubuntu0.1 (bug probably concerned wi ...
- STL 源代码剖析 算法 stl_algo.h -- partition
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie partition ------------------------------------ ...
- IT忍者神龟之Java动态代理与CGLib代理
<br>public class UserDAOImpl{ <br><br> public void save() { <br> / ...
- 翻页采用jaxa
<!-- 翻页采用jaxa --><script type="text/javascript">//class="page"下面的a被点 ...