题意:

  一棵树,

  操作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. vue前端开发。。。

    1. 官网下载 https://nodejs.org/en/ 2. 安装cnpm   在命令行:  npm install -g cnpm --registry=https://registry.np ...

  2. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  3. 【10】Cookie和Session

    一.cookie和session的介绍 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要"保持状态",因此cookie就是在这样一个场景下 ...

  4. .Net Core 环境下构建强大且易用的规则引擎

    本文源码: https://github.com/jonechenug/ZHS.Nrules.Sample 1. 引言 1.1 为什么需要规则引擎 在业务的早期时代,也许使用硬编码或者逻辑判断就可以满 ...

  5. 关于ES6

    一.变量声明const和let 变量提升:在ES6之前,我们都是用var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: fu ...

  6. 【AGC030F】Permutation and Minimum DP

    题目大意 有一个长度为序列 \(a\),其中某些位置的值是 \(-1\). 你要把 \(a\) 补成一个排列. 定义 \(b_i=\min(a_{2i-1},a_{2i})\),求有多少种可能的 \( ...

  7. Linux-ftp虚拟用户配置

    云服务器ESC 部署vsftpd 虚拟用户 说明:云服务器部署和本地服务器部署一样,都需要开通指定的相应端口,只不过云服务器需要在安全组规则中打开相应的端口允许通过. 环境说明: 对应的用户对应不同的 ...

  8. Django基础(路由、视图、模板)

    目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...

  9. mysql 在visual studio中的配置

    视图-->其他窗口-->服务器资源管理器-->数据连接-->右键添加连接 servername:localhost username:root password:123456 ...

  10. 【linux】常用命令集锦&持续更新...

    滴:转载引用请注明哦[握爪]:https://www.cnblogs.com/zyrb/p/9709013.html  对深度学习训练及日常work中的常用linux命令进行整理. [一]screen ...