题目传送门:HDU - 3966 Aragorn's Story

题目大意:

存在一个树,树上每个节点为一个阵营,阵营中存在敌人,现在要进行以下操作

I  C1  C2  K :将阵营C1到阵营C2路径经过的每个阵营的人数+k

D  C1  C2  K :将阵营C1到阵营C2路径经过的每个阵营的人数-k

Q  C:查询阵营C中的人数。

分析:

点权树链剖分,线段树维护区间和即可,单点查询,区间更新

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
const int MAX=50009;
struct Edge{int next,to;
}edge[MAX*2];
int head[MAX],cnt=0;
int fa[MAX],deep[MAX],son[MAX],size[MAX],top[MAX],id[MAX],rk[MAX],tot;
int n,m,p,a[MAX],u,v;
char op[2];
int sum[MAX<<2],lazy[MAX<<2];
inline void add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
}
void dfs1(int u,int f,int d)
{deep[u]=d;fa[u]=f;size[u]=1;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=fa[u]){dfs1(v,u,d+1);size[u]+=size[v];if(son[u]==-1||size[son[u]]<size[v])son[u]=v;}}
}
void dfstop(int u,int t)
{top[u]=t;id[u]=tot++;rk[id[u]]=u;if(son[u]==-1)return;dfstop(son[u],t);for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=son[u]&&v!=fa[u])dfstop(v,v);}
}void PushUp(int rt)            //维护区间和
{sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Build(int l,int r,int rt)
{if(l==r){sum[rt]=a[rk[l]];return;}int m=l+r>>1;Build(ls);Build(rs);PushUp(rt);
}
void PushDown(int ln,int rn,int rt)    //lazy标记下传
{if(lazy[rt]){lazy[rt<<1]+=lazy[rt];lazy[rt<<1|1]+=lazy[rt];sum[rt<<1]+=lazy[rt]*ln;sum[rt<<1|1]+=lazy[rt]*rn;lazy[rt]=0;}
}
void Update(int L,int R,int val,int l,int r,int rt)//区间更新
{if(L<=l&&r<=R){sum[rt]+=(r-l+1)*val;lazy[rt]+=val;return;}int m=l+r>>1;PushDown(m-l+1,r-m,rt);if(L<=m)Update(L,R,val,ls);if(R>m)Update(L,R,val,rs);PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt)
{if(L<=l&&r<=R)return sum[rt];int m=l+r>>1;int ans=0;PushDown(m-l+1,r-m,rt);if(L<=m)ans+=Query(L,R,ls);if(R>m)ans+=Query(L,R,rs);return ans;
}
void change(int x,int y,int v)        //更新x->y路径的权值
{while(top[x]!=top[y]){if(deep[top[x]]<deep[top[y]])swap(x,y);Update(id[top[x]],id[x],v,1,tot,1);x=fa[top[x]];}if(id[x]>id[y])swap(x,y);Update(id[x],id[y],v,1,tot,1);
}
void init()
{cnt=0;memset(head,-1,sizeof(head));tot=1;memset(son,-1,sizeof(son));memset(sum,0,sizeof(sum));memset(lazy,0,sizeof(lazy));memset(deep,0,sizeof(deep));
}
int main()
{ while(~scanf("%d%d%d",&n,&m,&p)){init(); for(int i=1;i<=n;i++)scanf("%d",&a[i]);while(m--){scanf("%d%d",&u,&v);add(u,v);add(v,u);}dfs1(1,0,0);dfstop(1,1);Build(1,tot,1);while(p--){int c1,c2,k;scanf("%s",op);if(op[0]=='I'){scanf("%d%d%d",&c1,&c2,&k);change(c1,c2,k);}if(op[0]=='D'){scanf("%d%d%d",&c1,&c2,&k);change(c1,c2,-k);}if(op[0]=='Q'){scanf("%d",&c1);printf("%d\n",Query(id[c1],id[c1],1,tot,1));} }}return 0;
}

转载于:https://www.cnblogs.com/LjwCarrot/p/10828118.html

HDU - 3966 Aragorn's Story(树链剖分)相关推荐

  1. HDU - 3966 Aragorn's Story(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,每个点都有一个权值,接下来有k次操作,每次操作分为下面几种类型: I u v x:将u-v这条路径上的所有点权值加上x D u v x:将u-v ...

  2. HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 树链剖分的模版,成段更新单点查询.熟悉线段树的成段更新的话就小case啦. 1 //树链剖分 边 ...

  3. hdu 4897 Little Devil I (树链剖分+线段树)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4897 题意: 给你一棵树,一开始每条边都是白色,有三种操作: 1.将 u - v路径上的边转换颜色 ...

  4. [hdu3966 Aragorn's Story]树链剖分

    题意:要求在一棵N(<=50000)个带权节点的树上支持3种操作 (1)I u v w,u到v的路径上每个节点权值增加w (2)D u v w,u到v的路径上每个节点权值减少w (3)Q u,求 ...

  5. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  6. HDU 3966 Aragorn's Story (树链剖分+线段树)

    题意:给你一棵树,然后有三种操作 I L R K: 把L与R的路径上的所有点权值加上K D L R K:把L与R的路径上的所有点权值减去K Q X:查询节点编号为X的权值 思路:树链剖分裸题(我还没有 ...

  7. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  8. HDU 3966 POJ 3237 HYSBZ 2243 HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  9. hdu 3966( 树链剖分+点权更新)

    题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...

最新文章

  1. 29 仿京东放大镜案例
  2. mac os mysql 命令_如何在Mac OS上安装“mysql”命令?
  3. 如何设置html中按钮边框颜色,CSS-为什么我的电子邮件按钮边框显示两种颜色,而边框颜色设置为仅显示一种颜色?...
  4. php数据存储mysql_php – 在MySQL中存储路线数据的最佳方式
  5. java arraylist排序_最全Java集合笔记
  6. 中介者模式分析、结构图及基本代码
  7. [转]Eclipse Java注释模板设置详解
  8. python自动化测试-基于 Python 的接口自动化测试实例
  9. The server of Apache (四)——配置防盗链和隐藏版本信息
  10. PageRank与社交网络模型评估
  11. (转)清华学霸演讲稿:永远不要说你已经尽力了
  12. UltraEdit 25注册机 通用版 32/64位 绿色免费版(附破解激活教程+序列号)
  13. ContextCapture与Pix4D生成正射影像并进行拼接修图(附航测练习数据下载)
  14. sharp s2 android 9,夏普s2第三方ROM AOSP(Android P)v105
  15. 计算机文件丢失不能正常启动,电脑说文件丢失或损坏开不了机怎么办?
  16. 如何高效使用Micropython看你喜欢看的视频?【下】(生成图片帧和WIFI传输播放)
  17. 读“人生有一种牛逼,叫我能背下来”
  18. php百分比乘加,PHP学习笔记第一篇 基础知识
  19. 租便宜的VPS应该注意什么?
  20. Docker推送一个自制镜像到dockerhub

热门文章

  1. 【好程序员笔记分享】——下拉刷新和上拉加载更多
  2. [转]Android 代码自动提示功能
  3. SQL注入攻击再度肆虐殃及大量网站
  4. selenium webdriver(python)_selenium、webdriver及浏览器的关系及对应版本安装
  5. 转载:c+string类详解
  6. 激光SLAM--标准数据集
  7. Vscode解决Setting.json报警告:Problems loading reference ... Unable to load schema from ...
  8. python的高级函数_Python的高级函数
  9. bytebuf池_Netty默认的Bytebuf是堆内还是堆外?池化or非池化?
  10. 声学漫谈之七:扬声器等效电路与参数