hdu3966 树链剖分+线段树 裸题
HDU - 3966
题意:给一颗树,3种操作,Q u 查询u节点的权值,I a b c 对a到b的路径上每个点的点权增加c,D a b c 对a b 路径上所有点的点权减少c
思路:树链剖分+线段树,2个问题,第一,如果是先建树再输入点的点权,记录tip(点映射到线段树后的位置),如果先输入点权,再建树,不仅要记录tip还要记录ran(线段树上某个位置上的点对应的树上点的序号,与tip是相互映射);第二,连接起线段树和树链剖分的是get函数,区间操作才需要用到get函数,单点操作直接在线段树上操作就可以。上面第一点尤其要注意,最重要的是理解tip和ran的意义 ,还有一点,多组输入son数组要初始化清空
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) #define lrt (rt*2) #define rrt (rt*2+1) using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8; const int N=51000; const ll mod=1e9+7;int n,m,q,a[N]; int to[N<<1],nex[N<<1],head[N],tot=1; int lazy[N<<2]; int siz[N],son[N],tip[N],dep[N],top[N],fa[N],ran[N],cnt; void add(int u, int v){to[tot]=v;nex[tot]=head[u];head[u]=tot++; } void dfs1(int u, int f){siz[u]=1;son[u]=0;fa[u]=f;dep[u]=dep[f]+1;for(int i=head[u]; i!=-1; i=nex[i]){int v=to[i];if(v==f) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[son[u]]<siz[v]) son[u]=v;} } void dfs2(int u, int tp){top[u]=tp;tip[u]=++cnt;ran[cnt]=u;if(son[u]) dfs2(son[u],tp);for(int i=head[u]; i!=-1; i=nex[i]){int v=to[i];if(v==fa[u] || v==son[u]) continue;dfs2(v,v);} } void push_down(int rt){lazy[lrt]+=lazy[rt];lazy[rrt]+=lazy[rt];lazy[rt]=0; } void creat(int rt, int l, int r){if(l==r){lazy[rt]=a[ran[l]];return;}int mid=l+r>>1;creat(lrt, l, mid);creat(rrt, mid+1, r); } void up(int rt, int l, int r, int L, int R, int w){if(l==L && r==R){lazy[rt]+=w;return;}push_down(rt);int mid=l+r>>1;if(R<=mid) up(lrt, l, mid, L, R, w);else if(L>mid) up(rrt, mid+1, r, L, R, w);else up(lrt, l, mid, L, mid, w), up(rrt, mid+1, r, mid+1, R, w); } int query(int rt, int l, int r, int p){if(l==r){return lazy[rt];}push_down(rt);int mid=l+r>>1;if(p<=mid) return query(lrt, l, mid, p);else return query(rrt, mid+1, r, p); } void update(int u, int v, int w){while(top[u] != top[v]){if(dep[top[u]]<dep[top[v]]) swap(u,v);up(1,1,n,tip[top[u]],tip[u],w);u=fa[top[u]];}if(dep[u]>dep[v]) swap(u,v);up(1,1,n,tip[u],tip[v],w); } int main(){//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);while(scanf("%d%d%d",&n,&m,&q)!=EOF){memset(head,-1,sizeof(head));mem(lazy),tot=1,cnt=0,dep[1]=0;int u,v,t;char c[10];for(int i=1; i<=n; ++i){scanf("%d",&a[i]);}for(int i=1; i<=m; ++i){scanf("%d%d",&u, &v);add(u,v);add(v,u);}dfs1(1,1);dfs2(1,1);creat(1,1,n);while(q--){scanf("%s%d", c, &u);if(c[0]=='I' || c[0]=='D' ){scanf("%d%d",&v, &t);if(c[0]=='D') t=-t;update(u,v,t);}else printf("%d\n",query(1,1,n,tip[u]));}}return 0; }
转载于:https://www.cnblogs.com/max88888888/p/7250189.html
hdu3966 树链剖分+线段树 裸题相关推荐
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- 【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,表示结点个数和操作数 ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树
题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...
- YbtOJ-染色计划【树链剖分,线段树,tarjan】
正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...
最新文章
- python写炒股软件_利用 Python 构建自己的股票投资系统
- 中层管理者,你到底怎样管理?
- Ubuntu系统Apache2部署SSL证书
- linux vsftpd关于500 OOPS错误问题解决
- ERROR: No query specified(Mysql数据库报错)
- 雷林鹏分享:codeigniter框架文件上传处理
- Linux shell 的字符串截取
- Java并发之Condition的实现分析
- 图及其应用实验报告 c语言,图的应用 实验报告
- springboot毕设项目流云医疗管理系统davy2(java+VUE+Mybatis+Maven+Mysql)
- 学习rtklib(三)
- Y z推荐菜东家 易订货生鲜系统_易订货推出生鲜专版,为生鲜农贸客户提供解决方案...
- 从“为什么创业”到“怎么创业”(转)
- PTA(十一)计算指数
- 关于idea创建maven工程没有src骨架的问题
- 利用frp和RDClient实现远程控制电脑
- 双电容单相电机原理与接线方法
- NLP 常用数据集及语料库
- 关于Vegas制作炫酷文字转场片头效果的教程分享
- 连续多年排名第一的比特梵德全方位安全杀毒软件2010最新版
热门文章
- 红旗h5中控台恢复出厂设置后不显示倒车影像问题
- 积累一些平时制作Excel 表格的常用公式与方法
- 上网代理设置会被自动清空_代理服务器上网(代理服务器老是自动打开)
- shawl.qiu Javascript 前景色背景色调色类 / BgColorScheme v1.1
- CKA认证考题+解析
- 【设计】资料合集(1-121)副业学习会
- 最难忘的一节计算机课,最难忘的一节课日记300字
- 如何释放计算机内存吗,Win7如何释放内存?三招帮你将电脑中的垃圾全部清理掉!...
- python 定时程序_python每天定时运行某程序代码
- Adobe Photoshop CC制作简单的个人Logo