P10603 BZOJ4372 烁烁的游戏 题解

news/2024/9/27 15:32:36

题目传送门

前置知识

动态树分治 | 动态开点线段树 | 标记永久化

解法

考虑动态点分治。

两种操作本质上是将 luogu P6329 【模板】点分树 | 震波 的操作互换了下,将原需支持单点修改、区间查询的数据结构换成需支持区间修改、单点查询的数据结构即可。

区间修改、单点查询的动态开点线段树可以考虑标记永久化。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct node
{int nxt,to;
}e[200010];
int head[200010],ask,cnt=0;
void add(int u,int v)
{cnt++;e[cnt].nxt=head[u];e[cnt].to=v;head[u]=cnt;
}
struct LCA
{int siz[200010],fa[200010],dep[200010],son[200010],top[200010];void init(){dfs1(1,0);dfs2(1,1);}void dfs1(int x,int father){siz[x]=1;fa[x]=father;dep[x]=dep[father]+1;for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=father){dfs1(e[i].to,x);siz[x]+=siz[e[i].to];son[x]=(siz[e[i].to]>siz[son[x]])?e[i].to:son[x];}}}void dfs2(int x,int id){top[x]=id;if(son[x]!=0){dfs2(son[x],id);for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=son[x]&&e[i].to!=fa[x]){dfs2(e[i].to,e[i].to);}}}}int lca(int u,int v){while(top[u]!=top[v]){if(dep[top[u]]>dep[top[v]]){u=fa[top[u]];}else{v=fa[top[v]];}}return (dep[u]<dep[v])?u:v;}int get_dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
}L;
struct SMT
{int root[200010],rt_sum=0;struct SegmentTree{int ls,rs,lazy;}tree[200010<<5];#define lson(rt) (tree[rt].ls)#define rson(rt) (tree[rt].rs)int build_rt(){rt_sum++;lson(rt_sum)=rson(rt_sum)=tree[rt_sum].lazy=0;return rt_sum;}void update(int &rt,int l,int r,int x,int y,int val){	if(rt==0){rt=build_rt();}if(x<=l&&r<=y){		tree[rt].lazy+=val;return;}int mid=(l+r)/2;if(x<=mid){update(lson(rt),l,mid,x,y,val);}if(y>mid){update(rson(rt),mid+1,r,x,y,val);}}int query(int rt,int l,int r,int pos){if(rt==0){return 0;}if(l==r){return tree[rt].lazy;}int mid=(l+r)/2;if(pos<=mid){return query(lson(rt),l,mid,pos)+tree[rt].lazy;}else{return query(rson(rt),mid+1,r,pos)+tree[rt].lazy;}}
}T[2];
struct Divide_On_Tree
{int siz[200010],weight[200010],vis[200010],fa[200010],center=0;void init(int n){center=0;get_center(1,0,n);get_siz(center,0);build(center);}void get_center(int x,int fa,int n){siz[x]=1;weight[x]=0;for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=fa&&vis[e[i].to]==0){get_center(e[i].to,x,n);siz[x]+=siz[e[i].to];weight[x]=max(weight[x],siz[e[i].to]);}}weight[x]=max(weight[x],n-siz[x]);if(weight[x]<=n/2){center=x;}}void get_siz(int x,int fa){siz[x]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=fa&&vis[e[i].to]==0){get_siz(e[i].to,x);siz[x]+=siz[e[i].to];}}}void build(int x){vis[x]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(vis[e[i].to]==0){center=0;get_center(e[i].to,0,siz[e[i].to]);get_siz(center,0);fa[center]=x;build(center);}}}void update(int x,int k,int val){T[0].update(T[0].root[x],0,ask,0,k,val);for(int rt=x;fa[rt]!=0;rt=fa[rt]){if(L.get_dis(fa[rt],x)<=k){T[0].update(T[0].root[fa[rt]],0,ask,0,k-L.get_dis(fa[rt],x),val);T[1].update(T[1].root[rt],0,ask,0,k-L.get_dis(fa[rt],x),val);}}}int query(int x){int ans=T[0].query(T[0].root[x],0,ask,0);for(int rt=x;fa[rt]!=0;rt=fa[rt]){ans+=T[0].query(T[0].root[fa[rt]],0,ask,L.get_dis(fa[rt],x));ans-=T[1].query(T[1].root[rt],0,ask,L.get_dis(fa[rt],x));}return ans;}
}D;
int main()
{int n,m,u,v,x,d,w,i;char pd;cin>>n>>m;ask=n;for(i=1;i<=n-1;i++){cin>>u>>v;add(u,v);add(v,u);}L.init();D.init(n);for(i=1;i<=m;i++){cin>>pd;if(pd=='Q'){cin>>x;cout<<D.query(x)<<endl;}else{cin>>x>>d>>w; D.update(x,d,w);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/65429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

养生壶专用液位检测芯片SC01/SC01B/WS003B实现液位提醒,告别干烧和溢液!

养生壶专用液位检测芯片SC01/SC01B/WS003B实现液位提醒方案ICMAN液位方案轻松实现水箱水位的非接触式液位检测/ 精确测量/防干烧保护!抗干扰能力强——ESD 接触式8KV 空间放电15KV,EFT为4KV,CS为动态10V 液位检测—— 健康家电、清洁家电的液位检测、高低液位提醒等少不了!…

【工具】postman妙用

postman妙用本文记录postman的一些妙用: 1.配合公共参数&动态参数: 1.1 公共参数: 1.2 动态参数: 2.自动化 2.1 Runner2.2 Flow3.自动生成 3.1 根据请求自动生成代码或者命令

PARTV-Oracle实例架构-内存架构

14. 内存架构 14.1. Oracle是数据库内存结构简介 当实例启动时,Oracle数据库会分配一个内存区域并启动后台进程。这个内存区域存储以下信息:程序代码 每个已连接会话的信息,即使它当前未活跃 程序执行期间需要的信息,例如,正在从中提取行的查询的当前状态 锁数据等在进程间…

【微服务】一张图搞懂微服务架构设计

1.前言 当前,微服务架构在很多公司都已经落地实施了,下面用一张图简要概述下微服务架构设计中常用组件。不能说已经使用微服务好几年了,结果对微服务架构没有一个整体的认知,一个只懂搬砖的程序员不是一个好码农! 2.流量入口 Nginx 在上图中可以看到,Nginx 作为整个架构的…

【性能测试】关于性能测试的各种指标

本指标适用于使用性能测试进行性能测试项目技术质量评价依据,规范技术测试结果评价,统一性能测试技术测试质量度量。应用系统技术质量度量指标范围广泛,本文难以涵盖全部。 预期读者为测试管理人员、测试实施人员、技术支持人员、项目管理人员等系统技术质量相关人员。 1.系…

使用VSCode进行Qt开发插件QtSupport

使用VSCode进行Qt开发 插件Qt Support 使用VSCode进行Qt开发一般都是使用的官方插件Qt tools,使用起来并不是太方便,所以我选择Qt Support插件。 一、Qt Support功能可以创建项目 导入基于CMake的qt项目 可以添加Qt项目文件Designer Form Class Designer Form C++ class Tran…

给Java同仁单点的AI开胃菜--搭建一个自己的本地问答系统

这是我参与创作者计划的第1篇文章大家好,因为对AI大模型很感兴趣,相信很多兄弟们跟我一样,所以最近花时间了解了一些,有一些总结 分享给大家,希望对各位有所帮助;本文主要是目标是 讲解如何在本地 搭建一个简易的AI问答系统,主要用java来实现,也有一些简单的python知识…

MySQL 表的CRUD与复合查询

目录表的增删改查Create指定列插入单行数据+全列插入多行数据+全列插入插入否则更新替换 (replace)Retrieve标准语法SELECT列全列查询限制显示条目 limit (分页查询)基本语法:指定列查询select 查询字段为表达式表达式重命名去重WHERE 条件比较运算符逻辑运算符案例:结果排序 O…