BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树
题意:给定一棵树,树上每个点有权值和类型。支持:修改某个点的类型;修改某个点的权值;询问某条链上某个类型的点的和/最大值。点数/类型数/询问数<=100000.
分析:
树链剖分,对每个类型的点建立线段树(动态开点)。
note: 忘记写t_query返回值调半天……
莫名其妙地1A
代码:
#include <bits/stdc++.h>
using namespace std; int a[],s[],dep[],size[],vis[],top[],wson[],fa[][],n,m,t1,t2,t3,t4;
int sid[],tid[],ind,cnt,ch[][],root[],c[],w[];
vector <int> g[]; void dfs1(int p){
size[p]=;
vis[p]=;
for(int i=;i<g[p].size();i++)
if(vis[g[p][i]]==) {
dep[g[p][i]]=dep[p]+;
fa[g[p][i]][]=p;
dfs1(g[p][i]);
size[p]+=size[g[p][i]];
if(size[g[p][i]]>size[wson[p]]) wson[p]=g[p][i];
}
} void dfs2(int p){
vis[p]=;
sid[p]=++ind;
tid[ind]=p;
if(wson[p]) {
top[wson[p]]=top[p];
dfs2(wson[p]);
}
for(int i=;i<g[p].size();i++)
if(vis[g[p][i]]==) {
top[g[p][i]]=g[p][i];
dfs2(g[p][i]);
}
} void lca_presolve() {
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
} int lca(int p,int q) {
if(dep[q]>dep[p]) swap(p,q);
for(int i=;i>=;i--) if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
for(int i=;i>=;i--) if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
if(p-q) p=fa[p][],q=fa[q][];
return max(p,q);
} void init() {
dep[]=;
top[]=;
dfs1();
memset(vis,,sizeof vis);
dfs2();
lca_presolve();
} void modify(int &p,int l,int r,int pos,int k) {
if(p==) p=++cnt;
if(l==r) {
a[p]=k;
s[p]=k;
}
else {
if(pos<=(l+r)/) modify(ch[p][],l,(l+r)/,pos,k);
else modify(ch[p][],(l+r)/+,r,pos,k);
a[p]=max(a[ch[p][]],a[ch[p][]]);
s[p]=s[ch[p][]]+s[ch[p][]];
}
} void tmodify(int t,int pos,int k) {
modify(root[t],,*n,sid[pos],k);
} int queryMax(int p,int l,int r,int ql,int qr) {
if(p==) return ;
if(l>qr||r<ql) return ;
if(l>=ql&&r<=qr) return a[p];
return max(queryMax(ch[p][],l,(l+r)/,ql,qr),queryMax(ch[p][],(l+r)/+,r,ql,qr));
} int querySum(int p,int l,int r,int ql,int qr) {
if(p==) return ;
if(l>qr||r<ql) return ;
if(l>=ql&&r<=qr) return s[p];
return querySum(ch[p][],l,(l+r)/,ql,qr)+querySum(ch[p][],(l+r)/+,r,ql,qr);
} int lqueryMax(int t,int anc,int son) {
int ans=;
while(dep[top[son]]>dep[anc]) {
ans=max(ans,queryMax(root[t],,*n,sid[top[son]],sid[son]));
son=fa[top[son]][];
}
ans=max(ans,queryMax(root[t],,*n,sid[anc],sid[son]));
return ans;
} int lquerySum(int t,int anc,int son) {
int ans=;
while(dep[top[son]]>dep[anc]) {
ans+=querySum(root[t],,*n,sid[top[son]],sid[son]);
son=fa[top[son]][];
}
ans+=querySum(root[t],,*n,sid[anc],sid[son]);
return ans;
} int tqueryMax(int t,int p,int q) {
int l=lca(p,q);
return max(lqueryMax(t,l,p),lqueryMax(t,l,q));
} int tquerySum(int t,int p,int q) {
int l=lca(p,q);
return lquerySum(t,l,p)+lquerySum(t,l,q)-w[l]*(c[l]==c[p]);
} string str; int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=n;i++) {
cin>>t1>>t2;
//tmodify(t2,sid[i],t1);
c[i]=t2;
w[i]=t1;
}
for(int i=;i<n;i++) {
cin>>t1>>t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
init();
for(int i=;i<=n;i++) {
tmodify(c[i],i,w[i]);
}
for(int i=;i<=m;i++) {
cin>>str>>t1>>t2;
if(str=="CC") {
tmodify(c[t1],t1,);
tmodify(t2,t1,w[t1]);
c[t1]=t2;
}
if(str=="CW") {
tmodify(c[t1],t1,);
tmodify(c[t1],t1,t2);
w[t1]=t2;
}
if(str=="QS") {
cout<<tquerySum(c[t1],t1,t2)<<endl;
}
if(str=="QM") {
cout<<tqueryMax(c[t1],t1,t2)<<endl;
}
}
}
BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树的更多相关文章
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- [GDOI2016][树链剖分+主席树]疯狂动物城
题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...
- HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树
题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...
随机推荐
- [MongoDB]评估使用mongodb的五个因素
企业选择 NOSQL 或非表格结构数据库,评估时应从以下五个关键维度来考虑:• 数据模型的类型• 查询模型是否能满足灵活的查询需求• 事务模型类型,以及一致性属于强一致性还是最终一致性• APIs 的 ...
- iOS编程实战 — 新的UI范式
iOS 7给苹果设备带来了全新的用户界面(UI).iOS 7在UI上的变化是自其诞生以来最大的.iOS 7专注于三个重要的特点:清晰.依从和层次.理解这三个特点很重要,因为这有助于设计跟原生的系统内置 ...
- Apache Solr JMX服务远程代码执行漏洞复现
0x00 漏洞介绍 该漏洞源于默认配置文件solr.in.sh中的ENABLE_REMOTE_JMX_OPTS配置选项存在安全风险. Apache Solr的8.1.1和8.2.0版本的自带配置文件s ...
- ssh远程连接到Ubuntu
1.ubuntu首先得安装ssh sudo apt-get install openssh-server 2.启动ssh sudo /etc/init.d/ssh start 3.检查是否开启 ps ...
- win10下载
Win10 简体中文正式版 微软MSDN官方ISO镜像下载(2020年1月21日更新) 官方地址:https://www.microsoft.com/zh-cn/software-download/w ...
- 前端调用本地摄像头实现拍照(vue)
由于调用摄像头有使用权限,只能在本地运行,线上需用https域名才可以使用. <template> <div class="camera_outer"> & ...
- 关于Synchronized研伸扩展
代码1 synchronized方法 synchronized void method(){ .......... } 代码2 synchronized代码块 synchronized (obj){ ...
- P1028 数的计算( 记忆剪枝 )
题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 n ): 先输入一个自然数 n(n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数 ...
- github访问过慢
转:https://baijiahao.baidu.com/s?id=1608100091125662190&wfr=spider&for=pc https://www.cnblogs ...
- jQuery笔记(五)jQuery表单验证
前言 上次我们说完jQuery中的动画之后,我们再来看一种jQuery在Web网页应用最为广泛的一种形式,这就是jQuery对表单的操作,通过jQuery对表单的操作,可以有效的提高用户体验.在此之前 ...