错在单点修改时传的是a,应该是id[a](Line 89)。谨记!!!

//fushao zuishuai
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll(x) (x<<1)
#define rr(x) (x<<1|1)
using namespace std; const int N=;
int w[N],a[N],maxx[N*],sum[N*];
int n,m,s[N*][],o[N],top[N],son[N],id[N],cnt,siz[N],d[N],f[N],dfn; void jia(int a,int b) {s[++cnt][]=b;s[cnt][]=o[a];o[a]=cnt;return;} void shang(int r) {maxx[r]=max(maxx[ll(r)],maxx[rr(r)]);sum[r]=sum[ll(r)]+sum[rr(r)];} void js(int r,int z,int y)
{
if (z==y) {sum[r]=a[z];maxx[r]=a[z];return;}
int k=z+y>>;js(ll(r),z,k);js(rr(r),k+,y);shang(r);
} void ddxg(int r,int z,int y,int g,int v)
{
if (z>g||y<g) return;
if (z>=g&&y<=g) {sum[r]=v;maxx[r]=v;return;}int k=z+y>>;
ddxg(ll(r),z,k,g,v);ddxg(rr(r),k+,y,g,v);shang(r);
} int cx1(int r,int z,int y,int zz,int yy)
{
if (z>yy||y<zz) return ;if (z>=zz&&y<=yy) return sum[r];
int k=z+y>>;return cx1(ll(r),z,k,zz,yy)+cx1(rr(r),k+,y,zz,yy);
} int cx2(int r,int z,int y,int zz,int yy)
{
if (z>yy||y<zz) return -;if (z>=zz&&y<=yy) return maxx[r];
int k=z+y>>;return max(cx2(ll(r),z,k,zz,yy),cx2(rr(r),k+,y,zz,yy));
} void dfs1(int x,int fa,int dep)
{
f[x]=fa;d[x]=dep;siz[x]=;
for (int i=o[x];i;i=s[i][])
if (s[i][]!=fa) {
dfs1(s[i][],x,dep+);siz[x]+=siz[s[i][]];
if (siz[s[i][]]>siz[son[x]]) son[x]=s[i][];
}
} void dfs2(int x,int tp)
{
id[x]=++dfn;top[x]=tp;a[dfn]=w[x];
if (son[x]) dfs2(son[x],tp);
for (int i=o[x];i;i=s[i][])
if (s[i][]!=f[x]&&son[x]!=s[i][]) dfs2(s[i][],s[i][]);
} int qiulu2(int a,int b)
{
int ans=-3e8;
while (top[a]!=top[b]) {
if (d[top[a]]<d[top[b]]) swap(a,b);
ans=max(ans,cx2(,,n,id[top[a]],id[a]));a=f[top[a]];
}
if (d[a]>d[b]) swap(a,b);ans=max(ans,cx2(,,n,id[a],id[b]));
return ans;
} int qiulu1(int a,int b)
{
int ans=;
while (top[a]!=top[b]) {
if (d[top[a]]<d[top[b]]) swap(a,b);
ans+=cx1(,,n,id[top[a]],id[a]);a=f[top[a]];
}
if (d[a]>d[b]) swap(a,b);ans+=cx1(,,n,id[a],id[b]);
return ans;
} int main()
{
cin>>n;int a,b,t=n-;while (t--) {scanf("%d%d",&a,&b);jia(a,b);jia(b,a);}
for (int i=;i<=n;i++) scanf("%d",&w[i]);dfs1(,,);dfs2(,);js(,,n);
cin>>m;char q[];
while (m--) {
scanf("%s",q);
if (q[]=='H') {scanf("%d%d",&a,&b);ddxg(,,n,id[a],b);}
if (q[]=='M') {scanf("%d%d",&a,&b);printf("%d\n",qiulu2(a,b));}
if (q[]=='S') {scanf("%d%d",&a,&b);printf("%d\n",qiulu1(a,b));}
}
return ;
}

让lu哥头痛了许久的代码(洛谷:树的统计)的更多相关文章

  1. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  2. 期待许久的事情终于发生-微软收购Xamarin

    刚在VS推送的新闻中看到了醒目的标题:Microsoft to acquire Xamarin and empower more developers to build apps on any dev ...

  3. 【阔别许久的博】【我要开始攻数学和几何啦】【高精度取模+同余模定理,*】POJ 2365 The Embarrassed Cryptographer

    题意:给出一大数K(4 <= K <= 10^100)与一整数L(2 <= L <= 106),K为两个素数的乘积(The cryptographic keys are cre ...

  4. 获得其他程序弹出菜单的内容(一个困扰许久的问题o(╯□╰)o)

    刚开始到现在公司的时候接到一个任务:开发一个activex控件,自动操作本地exe程序,当时遇到弹出菜单无法获取的问题,还好不影响,最近又遇到这个问题,绕不过去了,于是昨天花了一个上午百度了个遍,总算 ...

  5. docker 网络模式研究了许久,其实我们需要的是docker run -p 80:80命令

    我们只是希望能够从外部访问到docker而已,并不需要去折腾该死的网络模式,桥接,host等等. -p: 端口映射,格式为:主机(宿主)端口:容器端口 sudo docker run -t -i  - ...

  6. 被我忽略许久的set

    心塞,set一直是我忽略的一个数据结构 1.生成一个set: 1) set(iterable) 传入一个可以迭代的数据结构: eg:字符串;元组;列表,字典 2) {v1,v2,.......,vn} ...

  7. 关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑

    ---恢复内容开始--- 这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时间板子就死机了. 使用自己的就不会死机, ...

  8. 洛谷 P4838 P哥破解密码 题解

    矩阵乘法 + 快速幂优化递推: 看到这个题目我们不难想到递推,题干中说3个连续的A出现在序列中是不合法的,所以可以分为三种情况: (1):序列前只有一个A,如:BA,BBA,BABA. (2):序列前 ...

  9. 洛谷P2380 狗哥采矿

    P2380 狗哥采矿 题目背景 又是一节平静的语文课 狗哥闲来无事,出来了这么一道题 题目描述 一个n*m的矩阵中,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是 ...

随机推荐

  1. 为windows开启winrm service, 以便进行远程管理

    为windows开启winrm service, 以便进行远程管理   是windows 一种方便远程管理的服务:开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理 ...

  2. Solidworks如何在装配图中保存单独的一个零件

    如下图所示,我想要保存装配体的一个单独的零部件   选中该零件后点击编辑零部件   然后点击顶部的文件-另存为,弹出"解决模糊情形"对话框,询问你要保存装配体还是零部件   点击确 ...

  3. Centos修改文件打开数限制

    一.查看系统限制最大打开数 cat /proc/sys/fs/file-max 还有一个问题是file-max最大能设置多大呢?一个经验算法是 256个fd 需4M内存.例如8G内存,8*1024/4 ...

  4. Android监听HOME键的最简单的方法

    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...

  5. LeetCode题目: Remove Duplicate Letters

    问题描述 给一个字符串(只包含小写字母),删除重复的字母, 使得每个字母只出现一次.返回的结果必须是字典顺序最小的. 举例:“bcabc" -> "abc", &q ...

  6. C#中静态方法和非静态方法的区别

    静态方法和非静态方法的区别: 1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用: 2.静态方法只能访问静态成员和方法,非静态方法都可以访问: 3.静态方法不能标记为overri ...

  7. 15个私有云上的 DevOps 开源工具

    原文:http://www.sohu.com/a/136276885_262549 在可维护性,可靠性,效率和安全性方面,DevOps 为私有云在改进操作流程方面发挥着重要的作用.私有云是一个由许多硬 ...

  8. Android下缓存以及解决OOM问题

    1 http://my.oschina.net/ryanhoo/blog/93285 开篇来个简单的后续的慢慢补充 2 http://www.apkbus.com/forum.php?mod=view ...

  9. css 温故而知新 select-option 文字方向居右

    对select-option使用text-align:right;是无效的. 正确的姿势是:direction: ltr; 另外值得一提的是,通常还需要配合一点padding来美化.

  10. PriorityBlockingQueue优先队列的二叉堆实现

    转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6293807.html java.util.concurrent.PriorityBlockingQu ...