题意:给定一棵树,树上每个点有权值和类型。支持:修改某个点的类型;修改某个点的权值;询问某条链上某个类型的点的和/最大值。点数/类型数/询问数<=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 旅行 - 树链剖分,主席树的更多相关文章

  1. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  2. Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂

    原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...

  3. BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...

  4. bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...

  5. BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树

    4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...

  6. [GDOI2016][树链剖分+主席树]疯狂动物城

    题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...

  7. HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树

    题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...

  8. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  9. BZOJ4012 HNOI2015开店(树链剖分+主席树)

    考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...

随机推荐

  1. Android中点击按钮获取星级评分条的评分

    场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为Lin ...

  2. OBS使用教程

    OBS使用教程 OBS使用教程:录屏热键的设置 视频:基础画布分辨率1920/1080 1366,768输出缩放分辨率常用FPS值 30或者60 输出:输出模式:高级录像:编码器x264码率控制 CB ...

  3. Windows10设置系统参数

     屏幕分辨率设置 电源屏幕显示时间 投影可以进行手机投影到电脑进行操作,远程桌面可以进行远程访问,如云服务器 设置桌面图标和背景 设置默认应用 安装软件,必备的几项软件 --其中个人认为(1)(2)是 ...

  4. pycharm的这些配置,你都知道吗

    前言 对于一枚pycharm工具的使用新手,正确了解这门工具的配置,在使用过程中遇到的很多问题也可以迎刃而解哦!! 文章篇幅有限,本篇文章提供以下配置手段: 1.字体大小调整 2.显示你需要的工具窗口 ...

  5. VLAN和子网之间的区别与联系

    通常来说,子网和VLAN的相似之处在于它们都处理网络的一部分的分段或分区.但是,VLAN是数据链路层(OSI L2)的构造,而子网是网络层(OSI L3)的IP构造,它们解决网络上的不同问题.尽管在V ...

  6. 我眼中的ASP.NET.MVC

    MVC MVC全名 : Model View Controller ( Model-模型 View-视图  Controller-控制器)是一种经典的,经久不衰的,屹立不倒的软件设计框架.实现了业务逻 ...

  7. js中div显示和隐藏钮为什么页面总是跳一下到最上面

    <div class="menu_left"> <ul > <li id="t1" style="background- ...

  8. MySQL 8 服务器日志

    错误日志: 启动.运行.停止 mysqld(MySQL Server) 遇到的问题 通用查询日志: 建立客户端连接和从客户端接收的语句 二进制日志: 更改数据的语句(也用于复制) 中继日志: 从复制m ...

  9. P3759 [TJOI2017]不勤劳的图书管理员 [树套树]

    树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...

  10. 【巨杉数据库SequoiaDB】24 Hours , 数据库研发实录

    出场人物: ​ ​ 08:10 ​ 小H,是巨杉数据库引擎研发的一名工程师.7:20 天还蒙蒙亮,小H就起床了,点亮了心爱的光剑,开始了新的一天. ​ 在08:10时候,他已经洗漱完,锻炼好身体,倒好 ...