洛谷P4114 Qtree1(树链剖分+线段树)
传送门
LCT秒天秒地用什么树剖
这题可以算是树剖的比较裸的题目了
把每一条边的权值下放到他两边的点中深度较深的那个
然后直接用树剖+线段树带进去乱搞就可以了
1 //minamoto 2 #include<bits/stdc++.h> 3 using namespace std; 4 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;} 5 inline int read(){ 6 #define num ch-'0' 7 char ch;bool flag=0;int res; 8 while(!isdigit(ch=getchar())) 9 (ch=='-')&&(flag=true); 10 for(res=num;isdigit(ch=getchar());res=res*10+num); 11 (flag)&&(res=-res); 12 #undef num 13 return res; 14 } 15 char sr[1<<21],z[20];int C=-1,Z; 16 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;} 17 inline void print(int x){ 18 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x; 19 while(z[++Z]=x%10+48,x/=10); 20 while(sr[++C]=z[Z],--Z);sr[++C]='\n'; 21 } 22 const int N=1e5+5; 23 int head[N],Next[N<<1],ver[N<<1],edge[N<<1],tot=1; 24 inline void add(int u,int v,int e){ 25 ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e; 26 } 27 int val[N],num[N],son[N],sz[N],fa[N],dep[N],top[N],dfn[N],cnt; 28 int n; 29 void dfs1(int u){ 30 sz[u]=1,dep[u]=dep[fa[u]]+1; 31 for(int i=head[u];i;i=Next[i]){ 32 int v=ver[i]; 33 if(v!=fa[u]){ 34 fa[v]=u,num[i>>1]=v,dfs1(v),sz[u]+=sz[v]; 35 if(sz[son[u]]<sz[v]) son[u]=v; 36 } 37 } 38 } 39 void dfs2(int u,int t){ 40 top[u]=t,dfn[u]=++cnt; 41 if(son[u]){ 42 dfs2(son[u],t); 43 for(int i=head[u];i;i=Next[i]){ 44 int v=ver[i]; 45 if(v!=fa[u]&&v!=son[u]) dfs2(v,v); 46 } 47 } 48 } 49 int mx[N<<2]; 50 #define ls (p<<1) 51 #define rs (p<<1|1) 52 inline void upd(int p){mx[p]=max(mx[ls],mx[rs]);} 53 void build(int p,int l,int r){ 54 if(l==r) return (void)(mx[p]=val[l]); 55 int mid=(l+r)>>1; 56 build(ls,l,mid),build(rs,mid+1,r); 57 upd(p); 58 } 59 int query(int p,int l,int r,int ql,int qr){ 60 if(ql<=l&&qr>=r) return mx[p]; 61 int mid=(l+r)>>1,res=0; 62 if(ql<=mid) cmax(res,query(ls,l,mid,ql,qr)); 63 if(qr>mid) cmax(res,query(rs,mid+1,r,ql,qr)); 64 return res; 65 } 66 void update(int p,int l,int r,int x){ 67 if(l==r) return (void)(mx[p]=val[l]); 68 int mid=(l+r)>>1; 69 x<=mid?update(ls,l,mid,x):update(rs,mid+1,r,x); 70 upd(p); 71 } 72 inline void change(int i,int t){ 73 val[dfn[num[i]]]=t,update(1,1,n,dfn[num[i]]); 74 } 75 int query_path(int u,int v){ 76 if(u==v) return 0; 77 int res=0; 78 while(top[u]!=top[v]){ 79 if(dep[top[u]]<dep[top[v]]) swap(u,v); 80 cmax(res,query(1,1,n,dfn[top[u]],dfn[u])); 81 u=fa[top[u]]; 82 } 83 if(u==v) return res; 84 if(dep[u]<dep[v]) swap(u,v); 85 cmax(res,query(1,1,n,dfn[son[v]],dfn[u])); 86 return res; 87 } 88 char s[15];int a,b; 89 int main(){ 90 // freopen("testdata.in","r",stdin); 91 n=read(); 92 for(int i=1,u,v,e;i<n;++i) 93 u=read(),v=read(),e=read(),add(u,v,e),add(v,u,e); 94 dfs1(1),dfs2(1,1); 95 for(int i=1;i<n;++i) val[dfn[num[i]]]=edge[i<<1]; 96 build(1,1,n); 97 while(true){ 98 scanf("%s",s);if(s[0]=='D') break; 99 if(s[0]=='C') a=read(),b=read(),change(a,b); 100 else a=read(),b=read(),print(query_path(a,b)); 101 } 102 Ot(); 103 return 0; 104 }
转载于:https://www.cnblogs.com/bztMinamoto/p/9792785.html
洛谷P4114 Qtree1(树链剖分+线段树)相关推荐
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1153 Solved: 421 [Submit][Sta ...
- BZOJ3862Little Devil I——树链剖分+线段树
题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...
- CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)
题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...
- CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)
题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...
- P2486 [SDOI2011]染色(树链剖分+线段树)
题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...
- BZOJ4127Abs——树链剖分+线段树
题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树
题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...
- YbtOJ-染色计划【树链剖分,线段树,tarjan】
正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...
最新文章
- 每天都用ArrayList,你读过它的源码么?
- vue checkbox 默认选中
- numpy 数组 独热编码 one hot
- USACO network of school 强连通分量
- 数据库查找出list数据,进行处理
- Aiiage Camp Day4 A Board game
- 【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题
- jq在html中添加dom元素,使用jQuery添加DOM元素的最佳方法
- es6 Object.keys(),Object.values(),Object.entries()
- asp.net 获取客户端mac_Mac软件安利(人人影视 for Mac 3.1.2)
- pandas rolling方法_【干货】pandas相关工具包
- 启动u盘自动运行服务器,WinPE网启服务器自动配置程序
- ffmpeg second day
- Adobe Flex UIComponent LifeCycle
- 神经网络训练的一些方法
- 获取网页标题的小图标
- 中等分辨率卫星影像幅宽大比拼
- 代码封装的思想,竟然在中国古代就已经存在了
- 脱水冷冻干燥宠物食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 堆叠注入-强网杯2019随便注
热门文章
- boost::adjacency_list用法的测试程序
- VTK:结构化网格之BlankPoint
- VTK:PolyData之PointSource
- VTK:网格之WindowedSincPolyDataFilter
- OpenCV使用dnn重新着色灰度图像的实例(附完整代码)
- OpenCV绘图和文本输出功能的实例(附完整代码)
- OpenCV使用GDAL读取地理空间栅格文件
- OpenCV腐蚀和膨胀Eroding and Dilating
- C++实现huffman哈夫曼编码的算法(附完整源码)
- C++实现tree234树(附完整源码)