2023NOIP A层联测26 T3 tour
2023NOIP A层联测26 T3 tour
有意思的树上主席树。
思路
首先考虑一个点 \(p\) 能计入答案的情况,就是 \(dis(x,p)-a_p \ge a_p\)。 我们把 \(x \to y\) 的路径拆成 \(x \to lca,lca \to y\) 两条。
记录一个点 \(x\) 到根路径上的前缀和为 \(s_x\),对于两条路径,我们分类讨论:
第一条,合法条件为 \(s_x-s_p \ge a_p\),也就是 \(s_p+a_p \le s_x\)。左边的是一个关于 \(p\) 的式子,我们把它放到某个数据结构里面,查询一条链上小于等于给定值的值的个数,如果树给定,这显然是可以通过主席树来做的。
具体来说,每个点继承它父亲的版本,最后把两个版本一减就好了。
第二条,我们记录 lca 的父亲为 \(z\),那么合法条件为 \(s_x-s_z+s_p-s_{lca}-a_p \ge a_p\),也就是 \(2 \times a_p-s_p \le s_x-s_z-s_{lca}\)。
左边是一个关于 \(p\) 的式子,右边是一个定值,也可以用类似的方法通过主席树求出。
那么允许离线的方法就很明显了,先建出树,然后对于每个点维护两棵主席树,分别表示第一种和第二种情况,然后查询的时候拆成两条路径分别查询即可(注意不要重复算 lca)。
现在考虑在线。一个经典的方法是启发式合并,由于答案和树的形态无关,可以每次把 size 小的连通块合并到 size 大的连通块上,对于 size 小的那个连通块,我们暴力重构需要维护的信息,包括倍增数组、前缀和数组和主席树。然后正常查询就好了。
启发式合并的复杂度是 \(O(n \log n)\),再加上重构倍增数组和主席树,复杂度就是 \(O(n \log n \log V)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define lch(p) tree[p].ch[0]
#define rch(p) tree[p].ch[1]
const int maxm=5e7+10,maxn=1e5+5;
const int lim=5e8;
struct Tree
{
int ch[2],siz;
}S1[maxm],S2[maxm];
struct Edge
{
int to,nxt;
}edge[maxn*2];
int n,S1tot,S2tot,tot,tp,q,la;
int val[maxn],head[maxn],fa[maxn],sz[maxn],rt1[maxn],rt2[maxn],f[maxn][25],sum[maxn],dep[maxn];
void add(int x,int y)
{
tot++;
edge[tot].to=y;
edge[tot].nxt=head[x];
head[x]=tot;
}
int findroot(int x){return fa[x]==x?x:fa[x]=findroot(fa[x]);}
void insert(Tree *tree,int &tot,int &p,int l,int r,int x)
{
tree[++tot]=tree[p];
p=tot;
if(l==r){tree[p].siz++;return ;}
int mid=l+r>>1;
if(mid>=x) insert(tree,tot,lch(p),l,mid,x);
else insert(tree,tot,rch(p),mid+1,r,x);
tree[p].siz=tree[lch(p)].siz+tree[rch(p)].siz;
}
int query(Tree *tree,int p,int lp,int l,int r,int lx,int rx)
{
if(lx<=l&&r<=rx) return tree[p].siz-tree[lp].siz;
if(rx<l||r<lx) return 0;
int mid=l+r>>1;
return query(tree,lch(p),lch(lp),l,mid,lx,rx)+query(tree,rch(p),rch(lp),mid+1,r,lx,rx);
}
void dfs(int u,int fa,int d)
{
dep[u]=d;
f[u][0]=fa;
for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
rt1[u]=rt1[fa],rt2[u]=rt2[fa];
sum[u]=sum[fa]+val[u];
insert(S1,S1tot,rt1[u],-lim,lim,sum[u]+val[u]);
insert(S2,S2tot,rt2[u],-lim,lim,2*val[u]-sum[u]);
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fa) continue;
dfs(v,u,d+1);
}
}
int Lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
for(int i=20;i>=0;i--) if(dep[f[u][i]]>=dep[v]) u=f[u][i];
if(u==v) return u;
for(int i=20;i>=0;i--) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return f[u][0];
}
int main()
{
scanf("%d",&tp);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
fa[i]=i,sz[i]=1,sum[i]=val[i],dep[i]=1;
insert(S1,S1tot,rt1[i],-lim,lim,val[i]*2);
insert(S2,S2tot,rt2[i],-lim,lim,val[i]);
}
while(q--)
{
int op,u,v;
scanf("%d%d%d",&op,&u,&v);
if(tp) u=u^la,v=v^la;
if(!op)
{
int fu=findroot(u),fv=findroot(v);
if(sz[fu]<sz[fv]) swap(u,v),swap(fu,fv);
fa[fv]=fu,sz[fu]+=sz[fv];
dfs(v,u,dep[u]+1);
add(u,v);
add(v,u);
}
else
{
int lca=Lca(u,v);
int z=f[lca][0];
la=query(S1,rt1[u],rt1[z],-lim,lim,-lim,sum[u])+query(S2,rt2[v],rt2[lca],-lim,lim,-lim,sum[u]-sum[lca]-sum[z]);
printf("%d\n",la);
}
}
}
2023NOIP A层联测26 T3 tour的更多相关文章
- MySQL Nested-Loop Join算法学习
不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...
- ASP.NET MVC4入门到精通系列目录汇总
序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...
- X-Cart 学习笔记 完整目录
如果有需要,可以直接联系博主,讨论学习 一.了解X-CART. 3 二.PHP环境搭建... 3 三.安装配置X-CART. 4 1.下载X-Cart并配置域名,映射地址... 4 2.配置X-Car ...
- 使用ajax实现无刷新改变页面内容
如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" ...
- SIFT特征提取分析(转载)
转载自: http://blog.csdn.net/abcjennifer/article/details/7639681 SIFT(Scale-invariant feature transform ...
- [转]SIFT特征提取分析
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...
- (六)6.17 Neurons Networks convolutional neural network(cnn)
之前所讲的图像处理都是小 patchs ,比如28*28或者36*36之类,考虑如下情形,对于一副1000*1000的图像,即106,当隐层也有106节点时,那么W(1)的数量将达到1012级别,为了 ...
- 误差逆传播(error BackPropagation, BP)算法推导及向量化表示
1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes ...
- 目标检测网络之 YOLOv2
YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体. 每个格子预测B个bounding b ...
- javaweb面试题
1.Tomcat的优化经验 答:去掉对web.xml的监视,把JSP提前编辑成Servlet:有富余物理内存的情况下,加大Tomcat使用的JVM内存. 2.什么是Servlet? 答:可以从两个方面 ...
随机推荐
- 组合逻辑环(Combinational Logic Loop)
组合逻辑电路 组合逻辑电路是数字电子学中一类基本的电路类型,它由一系列逻辑门组成,用于实现特定的逻辑功能.与时序逻辑电路不同,组合逻辑电路的输出完全取决于当前的输入信号,而不受之前输入的影响.换句话说 ...
- Linux | Ubuntu 16.04.4 通过docker安装单机FastDFS
Ubuntu 16.04.4 通过docker安装单机fastdfs 前言 很久没有写技术播客了,这是一件很不应该的事情,做完了事情应该有沉淀的. 我先说一点前情提要,公司的fastdfs突然就挂了, ...
- Java并发编程学习前期知识上篇
Java并发编程学习前期知识上篇 我们先来看看几个大厂真实的面试题: 从上面几个真实的面试问题来看,我们可以看到大厂的面试都会问到并发相关的问题.所以 Java并发,这个无论是面试还是在工作中,并发都 ...
- linux 上抓包
#tcpdump -i mgmt0 -nn -s0 -v port 8001 capture IPv6 ping packets #tcpdump ip6 -i nic0 -nn -s0 and ic ...
- 如何在 Web 前端做 3D 音效处理
一.背景 在社交元宇宙.大逃杀等类型的游戏场景下,用户在通过简单语音交流外,结合场景也需要一些立体声效果来让用户感知游戏角色周围其他用户的存在及其对应的距离和方位,提高语音互动的趣味性. 为了满足 ...
- vivo 全链路多版本开发测试环境落地实践
作者:来自 vivo 互联网研发效能团队- Wang Kang 测试环境全链路多版本部署,解决多测试环境资源争抢等问题. 一.背景介绍 软件系统中全链路指的是从用户请求发起,到最终返回响应的整个过程中 ...
- maven安装本地jar命令
mvn install:install-file -Dfile=jar包的位置 -DgroupId=pom.xml的groupId -DartifactId=pom.xm的artifactId -Dv ...
- 林史·CLOI纪事本末
CLOI正源在JD,JD在初次短期集训结束后带出了一句经典名言: 那如果是在丛林里呢 这句话在短期内在全班范围内流传甚广,因此,\(GreatJungleLord\) 也因其幽默诙谐的形象赢得了大家的 ...
- nexus 部署与设置
安装nexus df -h 先查看目录磁盘空间,我安装的版本占用了四个G 空间,目录文件空间不够导致启动失败 上传 nexus 压缩包,并解压 查询 8081 端口号是否被占用 sudo netsta ...
- 手搓大模型Task03:手搓一个最小的 Agent 系统
前言 训练一个大模型是一件高投入低回报的事情,况且训练的事情是由大的巨头公司来做的事情:通常我们是在已有的大模型基础之上做微调或Agent等:大模型的能力是毋庸置疑的,但大模型在一些实时的问题上, ...