Vijos P1986 小h的妹子树二


题目

背景

小h同学的妹子实在是太多辣,多的他又种下了一颗妹子树。
描述

树上有n个妹子,两两之间有且仅有一条路径。
小h每次想泡两个妹子,但是妹子是一种奇怪的生物(雾),小h无论想泡哪一对妹子,都得为她们路径上的所有妹子支付软妹币(P.S.泡一个不就好了)。
这次我们的妹子树形态不会变了,但是她们需要的软妹币会变化。
小h很苦恼,他需要知道每一次泡妹子需要多少预算,他请求了小y,小y当然会辣,他想考考你。
支持两种操作:
Q u v 询问泡u和v的价值
C u v改变u的权值为v
格式

输入格式

输入文件第一行是一个整数n,表示n个妹子,从1开始编号。
输入文件第二行是n个正整数Vi,表示每个妹子的初始所需软妹币。
接下来n-1行,每行两个整数u和v,表示u和v有一条边。
然后是一个整数m,一共m此操作
接下来m上格式如上。
输出格式

对于每一次询问操作,你需要输出一个整数,表示所需的软妹币,每行一个答案。
样例1

样例输入1

3
1 2 3
1 2
2 3
5
Q 1 2
Q 1 3
C 2 3
C 3 5
Q 1 3

样例输出1

3
6
9

限制

对于前20%的数据,满足1<=n<=300,1<=m<=500
对于前60%的数据,满足1<=n<=3000,1<=m<=5000
对于20%的数据,是一条链
对于前50%的数据,保证是完全随机
对于前80%的数据,满足1<=n<=30000,1<=m<=50000
对于100%的数据,满足1<=n<=100000,1<=m<=200000,1<=Vi<=1000


题解

树剖+线段树


代码

#include<cstdio>
using namespace std;int n,tot,t,sz;
int lnk[100005],w[100005],size[100005],fa[100005],dep[100005],ft[100005],pos[100005],top[100005];
struct edge
{int nxt,y;
} e[200005];
struct tree
{int l,r,sum;
} tr[300005];int readln()
{int x=0;char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while ('0'<=ch&&ch<='9') x=x*10+ch-48,ch=getchar();return x;
}void add(int x,int y)
{tot++;e[tot].nxt=lnk[x];lnk[x]=tot;e[tot].y=y;tot++;e[tot].nxt=lnk[y];lnk[y]=tot;e[tot].y=x;
}void dfs1(int x)
{size[x]=1;for (int i=lnk[x];i;i=e[i].nxt){int y=e[i].y;if (fa[x]==y) continue;dep[y]=dep[x]+1;fa[y]=x;dfs1(y);size[x]+=size[y];}
}void dfs2(int x,int to)
{int k=0;sz++;pos[x]=sz;ft[sz]=x;top[x]=to;for (int i=lnk[x];i;i=e[i].nxt){int y=e[i].y;if (dep[y]>dep[x]&&size[y]>size[k]) k=y;}if (k==0) return;dfs2(k,to);for (int i=lnk[x];i;i=e[i].nxt){int y=e[i].y;if (dep[y]>dep[x]&&k!=y) dfs2(y,y);}
}void build(int l,int r,int rt)
{tr[rt].l=l,tr[rt].r=r;if (l==r) {tr[rt].sum=w[ft[l]];return;}int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}void change(int x,int y,int rt)
{int l=tr[rt].l,r=tr[rt].r;if (l==r) {tr[rt].sum=y;return;}int mid=(l+r)>>1;if (x<=mid) change(x,y,rt<<1); else change(x,y,rt<<1|1);tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}int query(int l,int r,int rt)
{int ll=tr[rt].l,rr=tr[rt].r;if (l==ll&&r==rr) return tr[rt].sum;int mid=(ll+rr)>>1;if (r<=mid) return query(l,r,rt<<1);else if (mid<l) return query(l,r,rt<<1|1);else return query(l,mid,rt<<1)+query(mid+1,r,rt<<1|1);
}void sort(int &x,int &y)
{int t=x;x=y;y=t;
}int solveq(int x,int y)
{int ret=0;while (top[x]!=top[y]){if (dep[top[x]]<dep[top[y]]) sort(x,y);ret+=query(pos[top[x]],pos[x],1);x=fa[top[x]];}if (pos[x]>pos[y]) sort(x,y);ret+=query(pos[x],pos[y],1);return ret;
}int main()
{n=readln();for (int i=1;i<=n;i++) w[i]=readln();for (int i=1;i<n;i++) add(readln(),readln());dfs1(1);dfs2(1,1);build(1,n,1);t=readln();while (t--){char ch=getchar();while (ch!='Q'&&ch!='C') ch=getchar();int x=readln(),y=readln();if (ch=='C') change(pos[x],y,1);else printf("%d\n",solveq(x,y));}return 0;
}

Vijos P1986 小h的妹子树二相关推荐

  1. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  2. OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域

    OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域    [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/781 ...

  3. 块状树(bzoj 3720: Gty的妹子树)

    问题概述: 一棵n个节点的树,每个节点都有一个权值,之后三种操作: ①0 u v查询以u点为根的子树中权值大于v的有多少个 ②1 u v表示将u点的权值修改为v ③2 u v表示新建一个节点,编号为节 ...

  4. 微信小程序使用weapp-qrcode生成二维码

    <canvas style="width:108rpx;height:108rpx; canvas-id='qrcode'></canvas> // weapp-qr ...

  5. 刷题记录:牛客NC15162小H的询问

    传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...

  6. 微信小程序使用canvas绘制二维码实现跳转小程序

    开始接到这个需求的时候,我查阅文档获取小程序码 | 微信开放文档 发现两种途径 需要后端在服务器上调用接口拿到二维码,因为调用的 https://api.weixin.qq.com这个域名是不允许上白 ...

  7. 微信小程序生成带动态参数二维码

    首先说一下我的使用场景,用户可根据id生成这一条记录的二维码,其他人扫码直接跳转到小程序,显示这条记录的具体信息. 分两步:第一在微信公众号后台配置,第二利用canvas前端实现二维码展示,并接收参数 ...

  8. 小H和游戏(无根树转有根树,思维)难度⭐⭐⭐★

    链接:https://ac.nowcoder.com/acm/contest/5203/D 来源:牛客网 题目描述 小H正在玩一个战略类游戏,她可以操纵己方的飞机对敌国的N座城市(编号为1~N)进行轰 ...

  9. 3720: Gty的妹子树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1440  Solved: 482 [Submit][Status][Di ...

最新文章

  1. bcftools安装
  2. mysql5.7 rmp_linux MySQL5.7 rpm安装(转)
  3. 宅家学习秘密武器!让时间从视频流和朋友圈中回到程序员的视野中吧!
  4. java web文件夹_JAVA WEB项目文件夹上传下载解决方案
  5. Web Hacking 101 中文版 十七、服务端请求伪造
  6. python数据类型的转换_python 数据类型间转换
  7. 云小课 | 云硬盘不用了如何处理?
  8. xfire开发webservice
  9. Android 系统(145)---ODM 开发用户常见需求文档(七)
  10. 数据结构 10分钟让你掌握经典排序(二)
  11. 超声波的四个特性_超声波传感器,超声波的特性
  12. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(八)
  13. python 使用 config 文件
  14. 国产数据库清单(2020年第1季度)
  15. NET F/T六维力传感器使用
  16. Ar大屏幕互动,面向非专业领域的体验
  17. 论文笔记 -- Fast-LIO -- ESIKF溯源
  18. Hyper-V 2016 系列教程30 机房温度远程监控方案
  19. 能Ping通外网但就是不能打开所有网页的解决办法
  20. 取得高等学校教师资格证应当具备什么学历要求

热门文章

  1. 揭秘“菲住布渴”中运用的黑科技:除了check in、坐电梯、开门...全部刷脸之外,还有什么?... 1
  2. 用555芯片构成单稳态电路分析以及参数选择
  3. Nginx知识点总结
  4. 浅析国内云计算云主机现状市场
  5. github可以刷星吗_GitHub 有偿刷星,上千 Star 数背后的猫腻
  6. mongodb---foursquare
  7. 查看服务器芯片组型号,linux查看硬件信息命令
  8. 综述:联邦学习隐私保护
  9. shell脚本 查看还有多少天过生日
  10. 迅雷看看看电影,画面是绿色的,不能看