题意:

  一棵树,

  操作1.$path(a,b)$之间的点权$+k$

  操作2.单点查询

题解:

树链剖分即可,注意代码细节,双向映射

主要是记录一下板子

#include <string.h>
#include <stdio.h>
#include <algorithm>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=edge[ii].next)
using namespace std;
const int maxn=5e4+20,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
//head
int casn,n,m,k;
int num[maxn];
class segtree{public:
#define nd node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
int node[maxn*4],n;
int *mp;
void maketree(int s,int t,int now){
if(s==t){
nd=num[mp[s]];
return ;
}else nd=0;
maketree(s,(s+t)/2,now<<1);
maketree((s+t)/2+1,t,now<<1|1);
}
void init(int nn,int *mps){
n=nn;mp=mps;
maketree(1,n,1);
}
void update(int s,int t,int x){
update(s,t,x,1,n,1);
}
int query(int pos){
return query(pos,1,n,1);
}
void update(int s,int t,int x,int l,int r,int now=1){
if(s<=l&&t>=r) {
nd+=x;
return ;
}
ndl+=nd,ndr+=nd;nd=0;
int mid=(l+r)/2;
if(s<=mid) update(s,t,x,l,mid,now<<1);
if(t>mid) update(s,t,x,mid+1,r,now<<1|1);
}
int query(int pos,int l,int r,int now=1){
if(l==r) return nd;
ndl+=nd,ndr+=nd;nd=0;
int mid=(l+r)/2;
if(pos<=mid) return query(pos,l,mid,now<<1);
else return query(pos,mid+1,r,now<<1|1);
}
}tree;
namespace chain{
struct data_e{
int to,next;
}edge[maxn<<1];
int head[maxn],nume,mp[maxn];
inline void addedge(int a,int b){
edge[++nume]={b,head[a]};
head[a]=nume;
}
int ltop[maxn],fa[maxn],deep[maxn];
int sz[maxn],remp[maxn];
int son[maxn],cnt;
void init(){
rep(i,1,n) head[i]=0;
cnt=0,nume=1;
}
void dfs1(int now,int pre,int d){
deep[now]=d,fa[now]=pre,sz[now]=1,son[now]=0;
forn(i,now){
int to=edge[i].to;
if(to!=pre) {
dfs1(to,now,d+1);
sz[now]+=sz[to];
if(sz[to]>sz[son[now]]) son[now]=to;
}
}
}
void dfs2(int now,int pre,int sp){
ltop[now]=sp;mp[now]=++cnt;remp[cnt]=now;
if(son[now]) dfs2(son[now],now,sp);
forn(i,now){
int to=edge[i].to;
if(to!=son[now]&&to!=pre) dfs2(to,now,to);
}
}
void update(int a,int b,int val){
while(ltop[a]!=ltop[b]){
if(deep[ltop[a]]<deep[ltop[b]])swap(a,b);
tree.update(mp[ltop[a]],mp[a],val);
a=fa[ltop[a]];
}
if(deep[a]>deep[b])swap(a,b);
tree.update(mp[a],mp[b],val);
}
}; int main() {
while(~scanf("%d %d %d",&n,&m,&k)){
rep(i,1,n) scanf("%d",num+i);
chain::init();
while(m--){
int a,b;scanf("%d%d",&a,&b);
chain::addedge(a,b);
chain::addedge(b,a);
}
chain::dfs1(1,0,1);
chain::dfs2(1,1,1);
tree.init(n,chain::remp);
while(k--){
char x[10];int a,b,c;
scanf("%s",x);
if(x[0]=='Q'){
scanf("%d",&a);
printf("%d\n",tree.query(chain::mp[a]));
}else if(x[0]=='I'){
scanf("%d %d %d",&a,&b,&c);
chain::update(a,b,c);
}else {
scanf("%d %d %d",&a,&b,&c);
chain::update(a,b,-c);
}
}
}
}

HDU 3966 树链剖分后线段树维护的更多相关文章

  1. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  2. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  3. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  4. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  5. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  6. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  7. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  8. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  9. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

随机推荐

  1. SpringBoot+AOP整合

    SpringBoot+AOP整合 https://blog.csdn.net/lmb55/article/details/82470388 https://www.cnblogs.com/onlyma ...

  2. webpack基本用法

    1. 压缩代码(production模式) optimization: { minimizer: [new UglifyJsPlugin({ cache: true, parallel: true, ...

  3. Ubuntu16设置Redis开机自启动

    Ubuntu16设置Redis开机自启动   Ubuntu16设置Redis开机自启动 设置条件: -Ubuntu16.04 -Redis-4.0.11 在redis目录下找到  utils/redi ...

  4. Linux系统扩容根目录磁盘空间的操作方法

    问题描述 系统的服务无法正常运行,查看磁盘空间,发现根目录已经满了 解决过程 1.添加磁盘空间 2.使用fdisk -l命令查看磁盘信息 3.新建磁盘分区 4.使用fdisk /dev/sda3, 创 ...

  5. <Android基础> (六) 数据存储 Part 2 SharedPreferences方式

    6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...

  6. 洛谷 P5110 块速递推

    题目大意: 给定一个数列a满足递推式 \(An=233*an-1+666*an-2,a0=0,a1=1\) 求这个数列第n项模\(10^9+7\)的值,一共有T组询问 \(T<=10^7\) \ ...

  7. ubuntu下adb的使用以及开启黑域

    ubuntu使用adb开启黑域 刷了原生后经好友推荐, 黑域对于App的管控效果还是很不错的 adb的安装 此处顺带着就把fastboot也安装了 sudo apt update sudo apt i ...

  8. Spring Boot学习总结四

    利用阿里的druid来管理数据库连接池,在此数据上针对多数据源的情况,做下讲解.首先加上该包 <dependency> <groupId>com.alibaba</gro ...

  9. Activity之间的跳转和数据传输

    1.显式跳转 protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...

  10. 三、Dockerfile的说明和编写

    一.docker hub的使用和说明: 我们要去找镜像,一般都会 https://hub.docker.com  的网站中去找,目前linux的容器,我们目前首选是alpine,因为容器非常小,可以满 ...