BZOJ-1036 [ZJOI2008]树的统计

树链剖分模版题。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cctype>
#include <cmath>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define travel(x) for(edge *p=fir[x]; p; p=p->n)
#define k(x) Key[x]
#define t(x) Tree[x]
#define s(x) Size[x]
#define b(x) Belong[x]
#define low(x) Lower[x]
#define dep(x) Deep[x]
#define h(x) Head[x]
#define l(x) Left[x]
#define r(x) Right[x]
#define w(x) Where[x]
#define maxn 30009
#define maxp 5000009
#define inf 0x7fffffff
using namespace std;
inline int read()
{int x=0, f=1; char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();return x*f;
}
struct edge{int y; edge *n;} e[maxn*2], *fir[maxn], *pt=e;
inline void AddE(int x, int y)
{pt->y=y, pt->n=fir[x], fir[x]=pt++;pt->y=x, pt->n=fir[y], fir[y]=pt++;
}
int Tree[maxn], Size[maxn], Belong[maxn], Lower[maxn], Deep[maxn], Head[maxn], Where[maxn], cnt, Key[maxn];
int Left[maxp], Right[maxp], sum[maxp], big[maxp], z, L, R;
int n, d[maxn], h[maxn], now;void dfs(int x)
{int maxs=-inf, maxl=0;travel(x) if (p->y!=h[x]){h[p->y]=x, d[p->y]=d[x]+1; dfs(p->y);if (s(b(p->y))>maxs) maxs=s(b(p->y)), maxl=p->y;}if (maxl)b(x)=b(maxl), w(x)=w(maxl)+1, s(b(x))++, dep(b(x))--;elsecnt++, b(x)=cnt, w(x)=1, s(cnt)=1, low(cnt)=x, dep(cnt)=d[x];travel(x) if (p->y!=h[x] && p->y!=maxl) h(b(p->y))=x;
}
void BuildT(int&k, int l, int r, int t)
{if (l==r){sum[t]=big[t]=k(k), k=h[k]; return;}int mid=(l+r)>>1;BuildT(k, l, mid, l(t)=++z), BuildT(k, mid+1, r, r(t)=++z);sum[t]=sum[l(t)]+sum[r(t)], big[t]=max(big[l(t)], big[r(t)]);
}
inline void Build()
{dfs(1); h(b(1))=0;rep(i, 1, cnt) now=low(i), BuildT(now, 1, s(i), t(i)=++z);
}void Edit(int k, int y, int l, int r, int t)
{if (l==r){sum[t]=big[t]=y; return;}int mid=(l+r)>>1;if (k<=mid) Edit(k, y, l, mid, l(t)); else Edit(k, y, mid+1, r, r(t));sum[t]=sum[l(t)]+sum[r(t)], big[t]=max(big[l(t)], big[r(t)]);
}
inline void Change(int x, int y){k(x)=y; Edit(w(x), y, 1, s(b(x)), t(b(x)));}void QueryM(int l, int r, int t)
{if (L<=l && r<=R) {now=max(now, big[t]); return;}int mid=(l+r)>>1;if (L<=mid) QueryM(l, mid, l(t));if (mid<R) QueryM(mid+1, r, r(t));
}
inline void Qmax(int x, int y)
{now=-inf; while (b(x)!=b(y)){if (dep(b(x))<dep(b(y))) swap(x, y);L=w(x), R=s(b(x)), QueryM(1, s(b(x)), t(b(x))), x=h(b(x));}if (d[x]<d[y]) swap(x, y);L=w(x), R=w(y), QueryM(1, s(b(x)), t(b(x)));printf("%d\n", now);
}
void QueryS(int l, int r, int t)
{if (L<=l && r<=R) {now+=sum[t]; return;}int mid=(l+r)>>1;if (L<=mid) QueryS(l, mid, l(t));if (mid<R) QueryS(mid+1, r, r(t));
}
inline void Qsum(int x, int y)
{now=0; while (b(x)!=b(y)){if (dep(b(x))<dep(b(y))) swap(x, y);L=w(x), R=s(b(x)), QueryS(1, s(b(x)), t(b(x))), x=h(b(x));}if (d[x]<d[y]) swap(x, y);L=w(x), R=w(y), QueryS(1, s(b(x)), t(b(x))); printf("%d\n", now);
}int main()
{n=read();rep(i, 1, n-1) {int x=read(), y=read(); AddE(x, y);}rep(i, 1, n) k(i)=read();Build();int q=read(); char ch[10];rep(i, 1, q){scanf("%s", ch); int x=read(), y=read();if (ch[1]=='H') Change(x, y);if (ch[1]=='S') Qsum(x, y);if (ch[1]=='M') Qmax(x, y);}
}

转载于:https://www.cnblogs.com/NanoApe/p/4479736.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

malloc/free 和 new/delete的联系和区别

一、malloc/free 1、 函数原型&#xff1a;void* malloc(longNumBytes) 该函数分配了NumBytes个字节&#xff0c;并返回了只想这块空间的的指针。如果分配失败则返回空。 函数原型&#xff1a;Void free(void *firstBytes) 该函数是将之前用malloc分配的内存空间释放&#…

RHCS集群原理概述

一、 什么是RHCSRHCS是Red Hat Cluster Suite的缩写&#xff0c;也就是红帽集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&#xff0c;可以给web应用、数据库应用等提…

Linux学习笔记11——文件I/O之二

一、文件共享 内核使用三种数据结构表示打开的文件&#xff0c;它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。 1、每个进程在进程表中都有一个记录项&#xff0c;记录项中包含有一张打开文件描述表  2、内核为所有打开文件维持一张文件表  3、每…

死锁产生的原因及条件、如何避免死锁

一、死锁的定义 是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造、成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相等待的进程称为死锁…

Git Proxy开关

2019独角兽企业重金招聘Python工程师标准>>> 这个是配合ShadowSocks使用的&#xff0c;在~/.bash_aliases或者~/.bash_profile中设置以下代码&#xff1a; #git proxy enable alias gitpe"git config --global http.proxy socks5://127.0.0.1:1080;git config …

SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )

单击第一个图标&#xff0c;第一个图标突出显示&#xff0c;单击第二个图标&#xff0c;第一个变灰&#xff0c;第二个突出显示&#xff0c;反之一样。单击history读取历史记录。 Controller ZCL_SUS_C_ORDER_CHANGE 1. DO_INITmethod DO_INIT. *CALL METHOD SUPER->DO_I…

cuda内存总结

&#xff11;&#xff0e;shared memory __shared__ 声明为共享内存&#xff0c;将会保存在共享内存中 &#xff12;&#xff0e;constant memory __constant__ 声明为常量内存&#xff0c;将会保存在常量内存中&#xff0c;常量内存是只读内存&#xff0c;声明时要静态的分配…

平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡

AVL树的插入 在向一棵本来高度平衡的AVL树中插入一个新节点时&#xff0c;如果树中某个结点的平衡因子的绝对值 > 1&#xff0c;则出现了不平衡。设新插入结点为P&#xff0c;从结点P到根节点的路径上&#xff0c;每个结点为根的子树的高度都可能增加1&#xff0c;因此在每…

Fork/Join框架介绍

转http://www.infoq.com/cn/articles/fork-join-introduction/ 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和…

为什么析构函数可以能声明为虚函数,构造函数不可以

转自&#xff1a;http://blog.csdn.NET/chen825919148/article/details/8020550 构造函数不能声明为虚函数&#xff0c;析构函数可以声明为虚函数&#xff0c;而且有时是必须声明为虚函数。 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 1 …

【DFS】NYOJ-325-zb的生日

【题目链接&#xff1a;NYOJ-325】 一道以我名字命名的题目&#xff0c;难道要我生日的时候再A&#xff1f; 思路&#xff1a;依旧深搜&#xff0c;但这个问题应该有一个专有名词吧&#xff0c;看别的博客说是 “容量为 sum/2 的背包问题”&#xff0c;不懂。。。 1 // abs() …

Ubuntu Sudo 无法解析的主机

如果对ubuntu在安装时候的主机名称不满意&#xff0c;可以使用如下的方法进行修改 需要注意的是如果只修改其中一个&#xff0c;使用sudo的时候会报“无法解析主机名称的”错误 1、进入etc目录&#xff0c;使用cat查看hosts文件 alloyubuntu:/etc$ cat hosts -n 1 127.0.0.1 …

信号集操作函数,信号未决、阻塞、递达

转载&#xff1a;信号集操作函数&#xff0c;信号阻塞与未决 一&#xff0c;信号集及相关操作函数 信号集被定义为一种数据类型&#xff1a; typedef struct { unsigned long sig[_NSIG_WORDS]&#xff1b; } sigset_t 信号集用来描述信号的集合&#xff0c;每个信号占用一位&a…

管道(Pipe)/createPipe

BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针 PHANDLE hWritePipe, // 指向写句柄的指针 LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针 DWORD nSize // 管道大小); 管道&#xff08;Pipe&#xff09;实际是用于进程间通信的一段共享内存&…

linux输出文字的颜色特效

有关文字颜色及背景色可以参考&#xff1a;man console_codes-e 用来开启echo中的转义\e 或 \033 来输出Esc符号设置颜色的格式&#xff1a; \e[背景色;前景色;高亮m \033[背景色;前景色;高亮m恢复默认为 \e[0m其中背景色可以被以下数字替换第一个参数&#xff1…

互斥锁和自旋锁分别适用于什么样的业务场景

在多线程并发环境中&#xff0c;当某段代码被多个线程并发执行会导致数据不一致的情况出现时&#xff0c;我们就需要对这段代码加锁以保证线程安全了&#xff0c;我们可以对它施加互斥锁或者自旋锁&#xff0c;具体根据这段代码的执行耗时来定。 互斥锁的特点是&#xff1a;一把…

线程安全和可重入函数的联系与区别

1、 线程安全&#xff1a; 线程安全是多线程访问时&#xff0c;采用了加锁机制&#xff0c;当一个线程访问该类的某个数据时&#xff0c;进行保护&#xff0c;其他线程不能进行访问直到该线程访问完&#xff0c;其他线程才可以使用。不会出现数据不一致或数据污染。 线程不…

C++11 多线程 基础

C11开始支持多线程编程&#xff0c;之前多线程编程都需要系统的支持&#xff0c;在不同的系统下创建线程需要不同的API如pthread_create()&#xff0c;Createthread()&#xff0c;beginthread()等&#xff0c;使用起来都比较复杂&#xff0c;C11提供了新头文件<thread>、…

LB负载均衡集群--LVS

LB集群&#xff1a;LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、keepalived &#xff0c;商业的硬件负载设备F5、Netscale。LB集群架构&#xff1a;当用户的请求过来时&#xff0c;会直接发到分发器&#xf…

linux 信号处理函数详解

转自&#xff1a;http://blog.csdn.NET/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中&#xff0c;由自身产生或由进程外部发过来的消息&#xff08;事件&#xff09;。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示&#xff0…