首页 > 其他分享 >『主席树』疯狂的颜色序列 题解

『主席树』疯狂的颜色序列 题解

时间:2024-09-03 11:03:45浏览次数:4  
标签:rt qr return 青花 int 题解 疯狂 信物 序列

又又又好久没写题解了

青花-周传雄

三月走过 柳絮散落
恋人们匆匆
我的爱情 闻风不动
翻阅昨日 仍有温度
蒙尘的心事
恍恍惚惚 已经隔世
遗憾无法说
惊觉心一缩
紧紧握着 青花信物
信守着承诺
离别总在 失意中度过
记忆油膏 反复涂抹
无法愈合的伤口
你的回头 划伤了沉默
那夜重逢 停止漂泊
你曾回来过
相濡相忘 都是疼痛
只因昨日 善良固执
委屈着彼此
打碎信物 取消来世
遗憾无法说
惊觉心一缩
紧紧握着 青花信物
信守着承诺
离别总在 失意中度过
记忆油膏 反复涂抹
无法愈合的伤口
你的回头 划伤了沉默
紧紧握着 青花信物
雕刻着寂寞
就好像我 无主的魂魄
纠缠过往 无端神伤
摔碎谁也带不走
你我一场 唤不醒的梦
紧紧握着 青花信物
信守着承诺
离别总在 失意中度过
记忆油膏 反复涂抹
无法愈合的伤口
你的回头 划伤了沉默
紧紧握着 青花信物
雕刻着寂寞
就好像我 无主的魂魄
纠缠过往 无端神伤
摔碎谁也带不走
你我一场 唤不醒的梦

疯狂的颜色序列

一句话题意:强制在线版 HH 的项链。

前置-主席树

本质就是动态开点的线段树,支持可持久化。

在有修改的题目中,通常是先建一棵普通线段树,修改操作变为每次新建一个将更改的节点,每次新增一条链,在它上面操作,记录根节点为时间戳,需要在哪个版本操作就动以其时间戳为根的哪棵树。

当然静态问题也可以用主席树解决,如区间第 \(k\) 小,以及这道区间数颜色等,做法就变为了以序列里的每个元素为根分别新建节点,此时我们若求 \(\left[l,r\right]\) 内的信息只需用 \(r\) 这棵树上的信息减去 \(l-1\) 这棵树上的信息即可。

图画起来不难,手模一下加速理解。

思路

如果不强制在线的话,这道题方法还是蛮多的,最简单且好理解的就是莫队做法。

考虑在这道题上使用主席树(虽然但是如果没有签我也想不到)。首要问题是,每个节点权值存什么,怎么维护。

我们考虑,一个点有贡献当且仅当其颜色在这段区间内首次出现。有了这个结论,我们可以在输入时就记录每个点的颜色上次出现的位置。这样一来,得出答案就可以通过判断该区间内每个点的颜色上次出现的位置是否在此区间,即若上次出现的位置在 \(\left[0,l-1\right]\) 内,该点是有贡献的。那么方法就出来了,我们记录每个点成为“上个相同颜色的点”的次数,只需要统计第 \(r\) 棵树与第 \(l-1\) 棵树在 \(\left[0,l-1\right]\) 范围内权值的差即可得出答案。

细节

所有在整个序列中首次出现的颜色上次出现位置都是 0,因此线段树维护范围是 \(\left[0,n\right]\)。

整体上看,属于加了主席树细节操作的支持单点修改区间查询的线段树,还是很好实现的。

关于数组大小,只要不是区间修改标记永久化的主席树,开 20 倍空间差不多就够了,不过这类题空间一般给的很宽松,个人习惯开 32 倍,即右移 5 位。

实现

#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
using namespace std;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define qr qr()
const int Ratio=0;
const int N=5e5+5;
int n,m,ans;
int las[N],rot[N],cnt;
int son[N<<5][2],va[N<<5];
namespace Wisadel
{
    #define ls (son[rt][0])
    #define rs (son[rt][1])
    #define mid ((l+r)>>1)
    int Wclone(int rt)
    {
        son[++cnt][0]=ls,son[cnt][1]=rs;
        va[cnt]=va[rt]+1;
        return cnt;
    }
    int Wupd(int rt,int l,int r,int x)
    {
        rt=Wclone(rt);
        if(l==r) return rt;
        if(x<=mid) ls=Wupd(ls,l,mid,x);
        else rs=Wupd(rs,mid+1,r,x);
        return rt;
    }
    int Wq(int u,int v,int l,int r,int x,int y)
    {
        if(x<=l&&r<=y) return va[v]-va[u];
        int res=0;
        if(x<=mid) res+=Wq(son[u][0],son[v][0],l,mid,x,y);
        if(y>mid) res+=Wq(son[u][1],son[v][1],mid+1,r,x,y);
        return res;
    }
    short main()
    {
        n=qr,m=qr;
        fo(i,1,n)
        {
            int x=qr;
            rot[i]=Wupd(rot[i-1],0,n,las[x]);
            las[x]=i;
        }
        fo(i,1,m)
        {
            int l=qr,r=qr;
            l=(l+ans)%n+1,r=(r+ans)%n+1;
            if(l>r) swap(l,r);
            printf("%d\n",ans=Wq(rot[l-1],rot[r],0,n,0,l-1));
        }
        return Ratio;
    }
}
int main(){return Wisadel::main();}

完结撒花~

标签:rt,qr,return,青花,int,题解,疯狂,信物,序列
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18394162

相关文章

  • 南沙信奥赛老师解一本通题:1410:最大质因子序列
    ​【题目描述】任意输入两个正整数m,n(1<m<n≤5000),依次输出m到n之间每个数的最大质因子(包括m和n;如果某个数本身是质数,则输出这个数自身)。【输入】一行,包含两个正整数m和n,其间以单个空格间隔。【输出】一行,每个整数的最大质因子,以逗号间隔。【输入样例】510【输......
  • SP1843 LEONARDO - Leonardo Notebook 题解
    题目传送锚点博客园食用更佳前置知识1前置知识2首先是判断有无解。先疯狂寻找完所有的环,然后判断是否是偶环,最后如果都是偶环,且偶环的路径数成双成对地出现,或全是奇环,就输出Yes,不然就直接pass掉,输出No。然后我们发现:这里竟然出现了置换群!!!为什么它是置换群呢?我们从群的定......
  • P10878 [JRKSJ R9] 在相思树下 III 题解
    Description给定一个长为\(n\)的序列\(a_{1\dotsn}\),需要对它进行两种操作共\(n-1\)次。对一个长度为\(l\)的序列\(b_{1\dotsl}\)进行一次操作将会把序列变为一个长为\(l-1\)的序列\(c_{1\dotsl-1}\):操作一中,\(\foralli\in[1,l),c_i=\max(b_i,b_{i+1})\);操作......
  • 如何训练一个 LSTM 网络以解决特定的序列预测问题(含代码示例)
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 定制JSON序列化的利器示例
    金额序列化:importcom.fasterxml.jackson.annotation.JacksonAnnotationsInside;importcom.fasterxml.jackson.databind.annotation.JsonDeserialize;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;importcom.rb.jrzl2.crm.infrastructure.constant.jso......
  • Capital许可管理常见问题解答
    在软件资产管理过程中,企业经常会遇到各种关于许可管理的问题。这些问题不仅影响软件的合规使用,还可能导致不必要的法律风险和成本浪费。作为专业的软件许可管理解决方案提供商,Capital致力于帮助企业轻松应对这些挑战。以下是Capital许可管理中常见的问题及其解答,助您更好地理解和......
  • 动手学深度学习8.1. 序列模型-笔记&练习(PyTorch)
    本节课程地址:序列模型_哔哩哔哩_bilibili本节教材地址:8.1.序列模型—动手学深度学习2.0.0documentation(d2l.ai)本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>sequence.ipynb序列模型想象一下有人正在看网飞(Netflix,一个国外的视频网站)上的电影。......
  • 十大时间序列模型最强总结(九)贝叶斯结构时间序列模型(BSTS)
    九、贝叶斯结构时间序列模型(BSTS)1.原理BSTS模型是基于贝叶斯框架的时间序列建模方法,它允许对时间序列数据中的趋势、季节性和假期效应进行建模。BSTS模型结合了结构时间序列模型和贝叶斯推断方法,以提供灵活的建模能力。2.核心公式推导:趋势:使用随机游走模型或加法趋势模型。季......
  • 十大时间序列模型最强总结(十)序列到序列模型(Seq2Seq)
    十、序列到序列模型(Seq2Seq)1.原理Seq2Seq模型是一种深度学习模型,用于处理序列到序列的任务,如机器翻译和时间序列预测。Seq2Seq模型通常由一个编码器和一个解码器组成,其中编码器处理输入序列,解码器生成输出序列。2.核心公式3.优缺点1)优点:适用于复杂的序列到序列任务,如机器翻译......
  • 【树莓派开发】树莓派GeanyIDE和控制台下C/C++中文乱码问题解决方法
    文章目录情况说明1.设置VS,将文件保存为UTF8编码2.更改GeanyIDE编码设置3.更改树莓派系统设置情况说明之前使用树莓派的时候,遇到了中文乱码的问题。VS2019编译器下写的.c文件,里面的中文注释在树莓派ide上乱码树莓派控制台上,C语言代码输出中文时乱码这里需要调整三个设置来解决该......