[dsu on tree] BZOJ5040. 未来研究

算法学习——dsu on tree dsu on tree也叫树上启发式合并,和启发式合并类似,其时间复杂度是O(nlogn)O(nlogn)O(nlogn),核心思想也是小的集合并到大的集合中去。在学习dsu on tree之前,我们先简单回顾一下启发式合并是什么启发式合并其实是很暴力的一个思想。先只看看合并,合并就是将两个集合A,BA,BA,B合并成一个集合CCC首先有一个操作是新建一个空集合,然后将集合A,BA,BA,B的每一个元素都放进去,这个时间复杂度是遍历集合A,BA,BA,B的每一个元素,也就是size(A+B)size(A+B 阅读详情

原题好像是莫队加点技巧O(nn√),我用莫队加配对堆搞过去了…

这题因为区间不交叉,根据包含关系可以建出一棵树,然后就相当于求子树的信息,可以用启发式合并,但是这样可能会多一个log,那么就用dsu on tree了

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

const int N=1000010;

int n,q,a[N];

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}

inline void read(int &x){
  char c=nc(); x=0;
  for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}

struct Qry{
  int l,r,g;
  friend bool operator <(Qry a,Qry b){
    return a.l<b.l || (a.l==b.l && a.r>b.r);
  }
}Q[N];

int cnt,G[N],S[N],vis[N],b[N],tot,t;
ll ans[N],sum[N],ti[N],mx,tms;

struct edge{
  int t,nx;
}E[N];

inline void addedge(int x,int y){
  E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt;
}

void PutAns(ll x){
  if(x>=10) PutAns(x/10); putchar(x%10+'0');
}

int size[N],son[N];

void pfs(int x){
  size[x]=1;
  for(int i=G[x];i;i=E[i].nx){
    pfs(E[i].t);
    if(son[x]==-1 || size[E[i].t]>size[son[x]]) son[x]=E[i].t;
    size[x]+=size[E[i].t];
  }
}

void add(int x){
  if(Q[x].l==Q[x].r){
    int cur=a[Q[x].l];
    sum[cur]++;
    mx=max(mx,sum[cur]*b[cur]);
    return ;
  }
  for(int i=G[x];i;i=E[i].nx) add(E[i].t);
}

void del(int x){
  if(Q[x].l==Q[x].r) sum[a[Q[x].l]]--;
  for(int i=G[x];i;i=E[i].nx) del(E[i].t);
}

void dfs(int x){
  for(int i=G[x];i;i=E[i].nx)
    if(E[i].t!=son[x])
      dfs(E[i].t),del(E[i].t),mx=0;
  if(~son[x]) dfs(son[x]);
  if(Q[x].l==Q[x].r){
    int cur=a[Q[x].l]; sum[cur]++;
    mx=max(mx,sum[cur]*b[cur]);
  }
  for(int i=G[x];i;i=E[i].nx)
    if(E[i].t!=son[x]) add(E[i].t);
  if(~Q[x].g) ans[Q[x].g]=mx;
}

int main(){
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  read(n); read(q); tot=q;
  for(int i=1;i<=n;i++)
    read(a[i]),b[i]=a[i];
  sort(b+1,b+n+1); t=unique(b+1,b+1+n)-b-1;
  for(int i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+1+t,a[i])-b;
  t=0;
  for(int i=1;i<=q;i++){
    read(Q[i].l),read(Q[i].r),Q[i].g=i;
    if(Q[i].l==Q[i].r) vis[Q[i].l]=1;
  }
  for(int i=1;i<=n;i++)
    if(!vis[i]) Q[++tot].l=i,Q[tot].r=i,Q[tot].g=-1;
  sort(Q+1,Q+1+tot); Q[0].r=n+1;
  son[0]=-1;
  for(int i=1;i<=tot;i++){
    while(Q[S[t]].r<Q[i].l) t--;
    addedge(S[t],i);
    S[++t]=i; son[i]=-1;
  }
  pfs(0); dfs(0);
  for(int i=1;i<=q;i++)
    PutAns(ans[i]),putchar('\n');
  return 0;
}
树上启发式合并(DSU-on-Tree) 树上启发式合并,用来解决子树查询问题,是一种离线的、“暴力的”算法。从某种角度而言,与莫队算法有些类似,即:按照我们指定的顺序对数据做一个遍历,在遍历过程中记录询问的答案。CF上有一个专门的blog,讲了很多,本文只涉及到有关轻重链剖分的部分。oi-wiki上有一个更短的文章。递归统计子节点的数据先统计轻儿子(统计完的数据即刻清空)最后统计重儿子(统计完的数据保留下来)统计自己的数据(就是再统计一遍轻儿子的数据,加上本节点的数据) 阅读详情

相关推荐

树上启发式合并(DSU on Tree)

一种在 O(nlogn) 复杂度内求树上问题的算法。

KaiserWilheim的博客 851

dsu on tree(树上启发式合并)详解

树上启发式合并详解。

a_forever_dream的博客 9967

基于R语言 meta/metafor 包进行荟萃分析(一)

在此部分中,使用连续结果详细描述了通用逆方差方法及其在meta分析中的应用,还介绍了固定效应法和随机效应法。我们已经展示了如何分别将典型数据与metacont和metagen函数一起使用,以及如何print和绘制森林图。我们还讨论了估计研究间方差的各种方法,并将Hartung-Knapp平差描述为经典随机效应方法的替代方法。此外,我们还说明了byvar选项的使用,这使得亚组分析更加简单。关于亚组分析的更多细节见后续章节。

Dunaichuanyi的博客 1万+

树上启发式合并(dsu on tree)

### dsu on tree $\text{dsu}一般指$\text{disjoint set union}$,即并查集。$\text{dsu on tree}$指树上合并与查询操作,但它的实现和普通的并查集并无关联,两者的共同点仅仅在于都能合并集合和查询而已。 $\text{dsu on tree}$,可以称为**树上启发式合并**,是一种巧妙的暴力。

tanjunming2020的博客 2966

UE5动画革命:如何用Motion Matching技术让你的游戏角色动作更流畅(附实战配置)

本文深入解析了UE5中Motion Matching技术的实战配置与应用。通过对比传统动画状态机的局限,详细阐述了如何构建动画数据库、在UE5中配置Pose Search Database及动画蓝图,并探讨了与IK融合、性能优化等进阶策略。该技术能显著提升游戏角色动作的流畅度与真实感,是下一代动画解决方案的核心。

weixin_29075633的博客 862

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 325

dsu on tree

Dsu On Tree

weixin_55355427的博客 812

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 357

优美的暴力——树上启发式合并(dsu on tree)

非常优美的暴力,把n^2优化成nlogn的神仙算法!

WerChange的OI博客 1844

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1411

一个中科大差生的8年程序员工作总结

今年终于从大菊花厂离职了,离职前收入大概60w不到吧,在某乎属于比较差的,今天终于有空写一下自己的职场故事,也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了,也有更多事情做错了,在这里记录一下,希望能够给后人一些帮助吧,也欢迎私信交流。文笔不好,见谅,有些细节记不清了,如果有出入,就当是我编的这个故事吧。 PS:有几个问题先在这里解释一下,评论就不一一回复了 1、关于差生,我本人在科大时确实成绩偏下,差生主要讲这一点,没其他意思。 2、因为买房是我人生中的大事,我认为需要记录和总结一下

陈小房的自我修炼 5万+

[bzoj5040][dsu on tree]未来研究

Description GX国未来研究的第一人–Hfu教授,最近获得了一份被认为是未来LY国的住民写下的日记。Hfu教授为了通过这份日 记来研究未来LY国的生活,开始着手调查日记中记载的事件。日记中记录了连续N天发生的时间,大约每天发生一 件。事件有种类之分。第i天(1&lt;=i&lt;=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大。Hfu教 授决定用如下的方法分析这些日...

Rose_max的博客 347

Autosar PNC网络管理配置-UserData的使用

之前配置的网络管理报文中的data都由ComM管理,后面客户新增了需求,最后两个byte需要发送,本文记录一下相关配置的修改能配置生成的,尽量不手码,毕竟手写一堆bug~

赞的博客 1906

bzoj 5040: 未来研究

Dsu on tree

OZY的博客 436

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 621

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[ 树上启发式合并 线段树 单调栈 ] BZOJ5040

可以用单调栈或线段树建出树,然后dsu on tree就好了。#include<bits/stdc++.h> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==

gjghfd 501

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

DSU ON TREE

还是一样的,对于当前节点为根的树, 我们所需要的是 在保存重儿子之后, 依次暴力遍历轻儿子,因为 两点间的权值和 是 dfs(u) + dfs(v) - 2dfs(lca(u,v)) == k dfs(u) 这里定义为 根到u的权值 lca 是u和v 的最近公共祖先。最重要思考的是保存什么样的信息。在了解递归之后,我们应该怎么做呢,暴力的思路就是,统计每个以某个节点为根的子树,暴力搜索所有节点,统计,然后在处理答案,这样时间复杂度是O(n²)的。求一条简单路径,权值和等于 k,且边的数量最小。

weixin_59561323的博客 1080

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

dsu on tree(树上启发式合并)

一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1、前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有儿子中拥有最多子树的儿子 轻儿子 一个结点的所有儿子中不是重儿子的儿子 重边 父亲与重儿子的连边 轻边 父亲与轻儿子的连边 重链 一堆重边连接而成的链 轻链 一堆轻...

qq_38227632的博客 317

学习笔记:树上启发式合并(DSU on tree)

求每个子树中最长的Dokhtar-kosh路径的长度。这个集合的大小可以认为是集合的高度(在正常情况下),而我们将集合高度小的并到高度大的显然有助于我们找到父亲。在这里,对于两个大小不一样的集合,我们将小的集合合并到大的集合中,而不是将大的集合合并到小的集合中。让高度小的树成为高度较大的树的子树,这个优化可以称为启发式合并算法。启发式算法是基于人类的经验和直观感觉,对一些算法的优化。首先可以分析出来,合法的Dk路径一定是上面的所有。到全局根的路径上的字母信息,新增一个字母改变奇偶性可以通过。

weixin_55851276的博客 1821

树上启发式合并(DSU on tree)

统计一棵树所有子树内结点的信息。

wbw121124的博客 521

【总结】dsu on tree

简介 树上启发式合并简称 dsu on tree ,其思想在于 暴力跑轻儿子的贡献 ,同时用桶记录下 重儿子的贡献 ,可以用于一类树的统计问题或 dp 优化,可以做到时间复杂度 O(nlogn) ,空间复杂度 O(n) 。 引入 直接讲实现方法吧。毕竟其他方法都没有实际意义。 Part 1. 预处理子树大小和重儿子 void dfs(int x,int fa) { siz[x]=1; for(auto y:g[x]) { if(y!=fa) { dfs(y,x); siz[x]+=siz

cqbzlydd的博客 585

DSU on tree——令人惊叹的想法

DSU on tree 首先感谢LX dalao的讲解。 DSU on tree用于解决静态树上众数问题,比如说Codeforces 600E 题目大意 给你一棵树,每个节点有一种颜色,问你每个子树x的颜色数最多的那种颜色,如果颜色数相同,那么种类数相加。 输入样例1 4 1 2 3 4 1 2 2 3 2 4 输出样例1 10 9 3...

XSamsara的博客 AFO 6952
上一篇: [后缀数组] BZOJ4650: [Noi2016] 优秀的拆分
下一篇: [容斥 状压DP] HDU4997. Biconnected
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值