P4092 [HEOI2016/TJOI2016]树 [ 树剖]

2024-01-30 02:08
文章标签 树剖 heoi2016 tjoi2016 p4092

本文主要是介绍P4092 [HEOI2016/TJOI2016]树 [ 树剖],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

单点修改 , 链查询查到了就break 

线段树查询时先找到区间 , 区间内尽量往右边找 , 这样深度更大

#include<bits/stdc++.h>
#define N 100050
#define M N*2
using namespace std;
int n,m,tag[N];
int first[N],next[M],to[M],tot;
int id[N],siz[N],dep[N],fa[N],son[N],top[N],pre[N],sign;
int val[N<<2];void add(int x,int y){next[++tot]=first[x],first[x]=tot,to[tot]=y;
}
void dfs1(int u,int f){siz[u]=1;for(int i=first[u];i;i=next[i]){int t=to[i]; if(t==f) continue;fa[t] = u , dep[t] = dep[u] + 1;dfs1(t,u); siz[u] += siz[t]; if(siz[son[u]]<siz[t]) son[u] = t;} 
}
void dfs2(int u,int Top){id[u] = ++sign; pre[sign] = u;top[u] = Top;if(son[u]) dfs2(son[u],Top);for(int i=first[u];i;i=next[i]){int t=to[i]; if(t==son[u] || t==fa[u]) continue;dfs2(t,t);}
}void Pushup(int x){val[x] = val[x<<1] + val[x<<1|1];
}
void Insert(int x,int l,int r,int pos,int v){if(l==r){ val[x] = v; return;}int mid = (l+r) >> 1;if(pos<=mid) Insert(x<<1,l,mid,pos,v);else Insert(x<<1|1,mid+1,r,pos,v);Pushup(x);
}
void Q(int x,int l,int r,int &ans){if(l==r && val[x]){ ans = max(ans,l); return;}int mid = (l+r) >> 1;if(val[x<<1|1]) Q(x<<1|1,mid+1,r,ans);else Q(x<<1,l,mid,ans);
}
void Tree_Q(int x,int l,int r,int L,int R,int &ans){if(L<=l && r<=R){if(val[x]) Q(x,l,r,ans); return;}int mid = (l+r) >> 1;if(L<=mid) Tree_Q(x<<1,l,mid,L,R,ans);if(R>mid) Tree_Q(x<<1|1,mid+1,r,L,R,ans);
}
int Quary(int x){while(top[x]!=1){int tmp=0;  Tree_Q(1,1,n,id[top[x]],id[x],tmp);if(tmp) return pre[tmp];x = fa[top[x]];} int tmp = 0; Tree_Q(1,1,n,id[1],id[x],tmp);return pre[tmp];
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y; scanf("%d%d",&x,&y);add(x,y),add(y,x);} dfs1(1,0); dfs2(1,1); tag[1] = 1; Insert(1,1,n,1,id[1]);while(m--){char s[3]; scanf("%s",s); int x; scanf("%d",&x);if(s[0]=='Q') printf("%d\n",Quary(x));if(s[0]=='C') if(!tag[x]) Insert(1,1,n,id[x],1), tag[x] = 1; } return 0;
}

 

这篇关于P4092 [HEOI2016/TJOI2016]树 [ 树剖]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658799

相关文章

AtCoder Beginner Contest 351 G. Hash on Tree(树剖维护动态dp 口胡题解)

题目 n(n<=2e5)个点,给定一个长为a的初始权值数组, 以1为根有根树, 树哈希值f计算如下: (1)如果一个点u是叶子节点,则f[u]=a[u] (2)否则, q(q<=2e5)次点权修改,每次问修改之后根节点(点1)的树哈希值f 思路来源 qiuzx_代码 题解 新开一个口胡题解专栏,记录当前题目水平不在我能力范围之内 但是看别人的代码能看懂,自己写可能要调一万

DTOJ 4538. 「TJOI / HEOI2016」排序

题意 在 2016 年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。 这个难题是这样子的:给出一个 $1 $ 到 n n n 的全排列,现在对这个全排列序列进行 m m m 次局部排序,排序分为两种: ( 0 , l , r ) (0, l, r) (0,l,r) 表示将区间 [ l , r ] [l, r] [l,r]

BZOJ3531 [Sdoi2014]旅行——树剖+动态开点线段树

Description S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教, S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标

NTT+分治FFT--P4091 [HEOI2016/TJOI2016]求和

传送门 这道题很妙啊 首先看题目中的式子,令新的 f ( n ) = ∑ i = 0 n S ( n , i ) × 2 i × ( i ! ) f(n)=\sum_{i=0}^nS(n,i)\times 2^i\times (i!) f(n)=∑i=0n​S(n,i)×2i×(i!),如果能快速求出这个式子的值,那么 a n s = ∑ i = 0 n f ( i ) ans=\sum_{i

NOIP模拟题 by天津南开中学 莫凡[tarjan][树剖][并查集]

考试总结: 解题报告: 一. 图的连通性: 题意:给定一图,动态删边,动态求是否连通,且查询中输入的变量需xor当前边数才为最终输入数据; 分析:只删边则可以逆向建边用并查集查询是否连通,并查集基本上也是现阶段唯一一种可以在线快速求联通的算法了; 具体实现的话,先把边用康托展开转化为n+1进制的数,再用map去映射一个编号,然后两个mapy一个通过编号存储边出现次数,一个通过编号存储这条

codevs4621软件包管理器[树剖]

其实这不是模板题,但这是我在搞不清楚边点的情况下A的第一道树剖题; 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fed

NOIP2015 day2 [二分][DP][树剖]

T1: 题意:在一个n长序列中取走m个数,使得任意相邻数之间差值最小值最大。 分析:要最大值最小最小值最大,典型的二分答案套路。二分答案以后把不满足的数给去掉(因为去掉前一个肯定不会比去掉当前这个更优),然后注意最后一个也要算,如果要用的次数不够了就不满足,然后就没了。 #include<iostream>#include<cstdio>using namespace std;cons

codeforces COMPFEST-13 I. Illusions of the Desert 树剖

I. Illusions of the Desert (rating: 2300) 链接 https://codeforces.com/contest/1575/problem/I 题意 给一棵n个节点的树,点权为ai 。 要求对链做区间查询,单点修改。查的是边权和,边权的定义为: wab = max(|ax+ay|,|ax−ay|)。 input 6 4 10 -9 2 -1 4

P3398 仓鼠找sugar(LCA,树剖)

题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入格式 第一行两个正整数n和q,表