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.要求 ...
随机推荐
- mybatis入门的前期准备
使用步骤如下: 首先创建一个Maven工程,在pom.xml文件中引入mybatis的jar包坐标 <dependencies> <dependency> <groupI ...
- 在centos7.x环境中SQL Server附加数据库
第一步,准备好windows与Linux之间文件传递的工具,下载并安装 https://winscp.net/eng/download.php 第二步,把本地的数据库文件拷贝一份,放到别的文件夹中,因 ...
- XSStrike工具的安装使用
0x01简介 XSStrike 是一款用于探测并利用XSS漏洞的脚本 XSStrike目前所提供的产品特性: 对参数进行模糊测试之后构建合适的payload 使用payload对参数进行穷举匹配 内置 ...
- JS 弹出小窗口
弹出窗口函数 function openwindow(url,name,iWidth,iHeight){ var url; //转向网页的地址; var name; //网页名称,可为空; var i ...
- jQuery---offset方法和position方法
offset方法和position方法 获取元素的相对于document的位置 //获取元素的相对于document的位置 $(".son").offset(); console. ...
- Selenium实战(七)——自动发送邮件
SMPT(Simple Mail Transfer Protocol)简单邮件传输协议,是一组由源地址到目的地址传送邮件的规则,可以控制信件的中转方式.Python的smptlib模块提供了简单的AP ...
- 一种使用SOC精确控制脉冲的方法
在emfi测试中需要精确的控制脉冲时间.控制器产生的脉冲信号会经过控压的MOS管,这些组件会造成很严重的延时,但是尽管如此,控制系统的高精度也是必须的,因为控制系统的误差会逐级下延,引起更大的误差. ...
- 用浏览器的油猴子脚本调用IDM下载百度云盘中的资料
用浏览器的油猴子脚本调用IDM下载百度云盘中的资料(只能支持单个文件下载) 第一步需要现在浏览器中安装油猴子插件Tampermonkey.crx 安装油猴子插件插件主页:https://tamperm ...
- windows系统安装Java(详细版)
1.下载JDK 官网下载: www.oracle.com/technetwork… 百度云下载: pan.baidu.com/s/1LGf3Podz…提取码:s6mg (官网下载步骤) 进入官网 ht ...
- LNMP环境配置(1)
安装Nginx.MySQL.PHP 概念 LNMP是Linux Nginx MySQL PHP 的简写,把Nginx.MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言. ...