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 树链剖分+线段树 裸题相关推荐

  1. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  3. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  4. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  5. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  6. 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 ...

  7. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  8. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. python写炒股软件_利用 Python 构建自己的股票投资系统
  2. 中层管理者,你到底怎样管理?
  3. Ubuntu系统Apache2部署SSL证书
  4. linux vsftpd关于500 OOPS错误问题解决
  5. ERROR: No query specified(Mysql数据库报错)
  6. 雷林鹏分享:codeigniter框架文件上传处理
  7. Linux shell 的字符串截取
  8. Java并发之Condition的实现分析
  9. 图及其应用实验报告 c语言,图的应用 实验报告
  10. springboot毕设项目流云医疗管理系统davy2(java+VUE+Mybatis+Maven+Mysql)
  11. 学习rtklib(三)
  12. Y z推荐菜东家 易订货生鲜系统_易订货推出生鲜专版,为生鲜农贸客户提供解决方案...
  13. 从“为什么创业”到“怎么创业”(转)
  14. PTA(十一)计算指数
  15. 关于idea创建maven工程没有src骨架的问题
  16. 利用frp和RDClient实现远程控制电脑
  17. 双电容单相电机原理与接线方法
  18. NLP 常用数据集及语料库
  19. 关于Vegas制作炫酷文字转场片头效果的教程分享
  20. 连续多年排名第一的比特梵德全方位安全杀毒软件2010最新版

热门文章

  1. 红旗h5中控台恢复出厂设置后不显示倒车影像问题
  2. 积累一些平时制作Excel 表格的常用公式与方法
  3. 上网代理设置会被自动清空_代理服务器上网(代理服务器老是自动打开)
  4. shawl.qiu Javascript 前景色背景色调色类 / BgColorScheme v1.1
  5. CKA认证考题+解析
  6. 【设计】资料合集(1-121)副业学习会
  7. 最难忘的一节计算机课,最难忘的一节课日记300字
  8. 如何释放计算机内存吗,Win7如何释放内存?三招帮你将电脑中的垃圾全部清理掉!...
  9. python 定时程序_python每天定时运行某程序代码
  10. Adobe Photoshop CC制作简单的个人Logo