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.要求 ...
随机推荐
- C# protobuf自动更新cs文件
网上的教程大都是手动通过protoc编译, 比较难用 给当前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通过nuget), 然后 ...
- 了解JavaScript的语法基础,值和变量
通过JavaScript语法基础学习了解到1.怎么使用js/*通常js的引入和css一样,分为内部,外部和行内引入,执行自上而下,有着先后顺序*/:2.js的语法/*2.1js是用字母,数字.特殊字符 ...
- 什么是AOP面向切面编程思想
一.什么是AOP? 1.AOP不是一种语言,是一种编程范式 常见的编程范式: 面向过程.面向对象.函数式编程.事件驱动编程等 2.AOP可以解决特定问题,不能解决所有问题. 3.是面向对象的补充,不是 ...
- ssh远程连接到Ubuntu
1.ubuntu首先得安装ssh sudo apt-get install openssh-server 2.启动ssh sudo /etc/init.d/ssh start 3.检查是否开启 ps ...
- SSH自动断开后重连的解决方案
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ssh-conn ...
- 制作MySQL RPM安装包Spec
适用环境: 数据库版本:MySQL 操作系统:CentOS 7 制作思路: 将数据库初始化和配置工作放到安装脚本中方便定制: 1.打包MySQL应用目录 2.不自动生成配置文件 3.不自动生成数据目录 ...
- 剑指offer-面试题47-礼物的最大价值-动态规划
/* 题目: 给定一个m*n的棋盘,每格放一个礼物(每个礼物的值大于0), 从左上角出发,向下或向右走到达右下角,得到的礼物和最大. */ /* 思路: f(i,j)=max[f(i-1,j),f(i ...
- js磁力线代码(非压缩,自己在压缩的版本上优化了代码,易于阅读)
拿去白嫖吧: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" ...
- C#MVC用ZXing.Net生成二维码/条形码
开篇:zxing.net是.net平台下编解条形码和二维码的工具. 首先创建新项目 选择MVC模板 添加一个控制器 在项目引用中的引用ZXing 进行联网下载 控制器需要引用 后台控制器 pu ...
- Excel创建下拉列表限制数据有效性
方法 选中目标区域,点击菜单栏[数据]-[数据验证]-验证条件选择[序列]-输入所需文本即可