HDU 3966 树链剖分后线段树维护
题意:
一棵树,
操作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 树链剖分后线段树维护的更多相关文章
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
随机推荐
- 菜鸟学IT之第一次作业
作业的要求来自于:https://www.cnblogs.com/greyzeng/p/9581624.html 反思· 为何要来上课并且认真参与? 在大学中的师生关系? 自我简述题目 心得· 学习态 ...
- asp.net 文件分片上传
最近在研究文件上传,里面的门道还是挺多的,网上大多数文章比较杂乱,代码都是片段,对于新手小白来说难度较高,所以在此详细写一下今天看到的一个demo,关于文件分片上传的. <!DOCTYPE ht ...
- React Native & Android & iOS & APK
React Native & Android & iOS & APK https://play.google.com/apps/publish/signup/ $ 25 bui ...
- iOS-Mac上进行Fluttrt的安装
1.进入网站进行Flutter 的下载,压缩包解放存放当一个目录 2.进行将Flutter添加到路径, vim ~/.bash_profile 点击i进行编辑,添加flutter存放的路径 expor ...
- cv2.matchTemplate()函数的应用,匹配图片后画出矩形
import cv2 as cv import numpy as np """ matchTemplate(): 参数image:待搜索的图像(大图) 参数temple: ...
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- 如何用Electron Js创建第一个应用Hello World
什么是Electron Node.js和Chromium的结合品.允许只使用HTML,CSS和JavaScript来开发跨平台桌面应用. 编写第一个Electron程序(Hello World) 在开 ...
- 【JVM】JVM随笔索引
JVM目录 [JVM]Java内存模型 [JVM]类加载机制 [JVM]深度分析Java的ClassLoader机制(源码级别) [JVM]关于类加载器准备阶段的一道面试题目 [JVM]JVM垃圾收集 ...
- 自定义滚动条样式-transition无效
问题 需求是自定义滚动条样式,然后2秒内无操作隐藏滚动条. 2s内隐藏比较麻烦,不能用css实现,只能监听容器的touch事件,然后给滚动条加个opacity: 0的class. .class::-w ...
- CF1153D Pigeon d'Or
Description 给一棵树,每个点是子节点的最大值或最小值,将叶子节点填上整数,使这棵树的根最大. Solution 明显的\(dp\)题,代码很短. 分类讨论如下: 1.如果是叶子节点,\(d ...