CF911G Mass Change Queries【动态开点线段树】

权值线段树(含动态开点) 前言:所谓权值线段树,其实是很简单的一个数据结构,它通常用log n的询问来求第k大,第k小这样的问题,它自身的实现也是非常简单。 首先我们得了解权值线段树所维护的东西。权值线段数,它每一个区间所代表的,是有多少个数在这个区间内,举个例子。 ... 阅读详情

题意

给出一个数列,有qqq个操作,每种操作是把区间[l,r][l,r][l,r]中等于xxx的数改成yyy.输出qqq步操作完的数列.

思路

由于数列中每个数的大小只有100,可以对每一个数建立一颗权值线段树,也就是建一百颗权值线段树。
当然这样会导致MLE,于是考虑动态开点线段树。
考虑每一个操作(l,r,x,y)(l, r, x, y)(l,r,x,y),需要把xxx权值线段树中的(l,r)(l,r)(l,r)区间有值的位置清空,把yyy权值线段树中对应的位置赋值。
那么其实可以使用类似线段树合并的操作,把xxx中有权值的区间(树的枝节)合并到yyy的权值线段树中。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <cmath>

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200005, M = 20000005;

struct TreeNode
{
    int l, r;
}t[M];
int rt[105], id;
int ans[N];

void make(int& i, int l, int r)
{
    if (i) return;
    i = ++ id;
}

void updatePos(int& i, int l, int r, int pos)
{
    make(i, l, r);
    if (l == r) return;
    int mid = (l + r) >> 1;
    if (pos <= mid) updatePos(t[i].l, l, mid, pos);
    else updatePos(t[i].r, mid + 1, r, pos);
}

int Merge(int i, int j)
{
    if (!i || !j) return i | j;
    t[i].l = Merge(t[i].l, t[j].l);
    t[i].r = Merge(t[i].r, t[j].r);
    return i;
}

void updateRange(int& i, int& j, int l, int r, int L, int R)
{
    if (!i) return;
    if (L <= l && r <= R)
    {
        j = Merge(i, j);
        i = 0;
        return;
    }
    make(j, l, r);
    int mid = (l + r) >> 1;
    if (L <= mid) updateRange(t[i].l, t[j].l, l, mid, L, R);
    if (R > mid) updateRange(t[i].r, t[j].r, mid + 1, r, L, R);
}

void solve(int i, int l, int r, int k)
{
    if (!i) return;
    if (l == r)
    {
        ans[l] = k;
        return;
    }
    int mid = (l + r) >> 1;
    solve(t[i].l, l, mid, k);
    solve(t[i].r, mid + 1, r, k);
}

int main()
{
    #ifdef ZYCMH
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
    #endif
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        scanf("%d", &x);
        updatePos(rt[x], 1, n, i);
    }

    int m;
    scanf("%d", &m);
    for (int i = 1; i <= m; i ++ )
    {
        int l, r, x, y;
        scanf("%d%d%d%d", &l, &r, &x, &y);
        if (x == y) continue;
        updateRange(rt[x], rt[y], 1, n, l, r);
    }

    for (int i = 1; i <= 100; i ++ )
        solve(rt[i], 1, n, i);
    
    for (int i = 1; i <= n; i ++ )
        printf("%d ", ans[i]);
    puts("");

    return 0;
}

H2O到OmniH2O细节解读,人形机器人遥操作的技术演进与哲学 摘要:CMU何泰然团队相继发表的H2O和OmniH2O论文为人形机器人遥操作领域带来突破。H2O首创Sim-to-Data方法,通过形态/动作重定向和特权筛选处理人类动作数据,PPO算法实现基础控制。OmniH2O改进为教师-学生蒸馏框架,采用DAgger算法增强泛化能力,并消除对线速度输入的依赖。这两项工作从概念验证到工程落地,建立了一套完整的动作学习范式,为具身智能研究提供了重要参考。 阅读详情

相关推荐

M1安装homebrew报错LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54解决方法

在mac系统中,使用homebrew可以很方便的管理包。但按照官网的说明执行命令时总是报错原因是这个资源访问有问题,那么我们可以直接使用国内的镜像。给大家推荐一个中国科学技术大学的镜像站点,里面有各种资源https言归正传,开始踩坑。......

qq_42427085的博客 1455

23.CF911G Mass Change Queries 动态开点权值线段树+线段树合并

给出一个数列$a_i \in [1, 100]$,有$q$个操作,每种操作是把区间$[l,r]$中等于$x$的数改成$y$.输出$q$步操作完的数列。

HeartFireY的博客 405

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2874

线段树总结[经典、权值、动态开点]

ps:这是本蒟蒻的第一篇数据类型博客。   线段树,这是一种非常常用、普遍的信息统计技术。其基本思想是分治(二分),该数据类型本质上是一个储存区间数据二叉树

Xm_wy的博客 1300

X猫免费小说安卓逆向分析

七猫免费小说安卓逆向分析 难度(♥♥) 文章目录七猫免费小说安卓逆向分析 难度(♥♥)1. 查壳2. 抓包分析3. sign1. Frida-rpc2. Native函数分析快3点了. 睡觉~ 白天再继续写! 1. 查壳 我这边使用的是ApkTool, 拖进去显示未加壳。 2. 抓包分析 POST https://xiaoshuo.wtzw.com/api/v1/login/index HTTP/1.1 net-env: 1 channel: qm-cbcpa056_wm is-white: 0 platf

Qiled的博客 4366

汇川Easy 301 和MCGS进行Modbus RTU通讯(485)浮点数读取和写入

4DF0001对应寄存器D0,4DF0003对应寄存器D2。注意:要选com2口,com1口是232通讯。

qq_61916672的博客 2900

权值线段树算法讲解及例题

普通的线段树一般是求区间之和或区间最值,所以这些线段树的每个节点的下标是原数组中的区间范围,每个节点存的是区间和或最值,而权值线段树的每个节点的下标是数组中元素的值,而权值线段树每个节点存的是当前元素出现的次数。在开始建树之前对原数组的值进行离散化,在线段树中操作时,因为经过了离散化,所以最大的值最多也只有元素个个数那么大,所以就可以写不同线段树就行了。这道题我用的是动态开点完成,在原数组输入的时候在update函数对现在贡献的逆序对进行记录,并同时将当前的元素加入线段树中,在查询并累加贡献和。

STY_fish_2012的博客 919

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2053

动态开点线段树

本文要求读者对线段树较为熟悉,并能理解左闭右开的区间。动态开点线段树的写法非常多,读者应选择自己喜欢的方式去实现。

小猪爱拱地 1059

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。

丨汀、的博客 7591

CF911G Mass Change Queries(线段树+暴力)

cf机子真的快。 其实这个题的维护的信息还是很巧妙的。 首先,观察到题目中涉及到,区间修改这个操作,然后最后只查询一次,我们不妨用线段树来维护这个过程。 但是貌似直接维护每个位置的值可能不太好维护。 这时候我们考虑 每一个节点维护一个tototo数组,其中to[i]to[i]to[i]表示这个节点对应的区间里面,iii这个值将会变成哪个值。 一开始,每个节点的to[i]=ito[i]=ito[i]...

y_immortal的博客 QwQ(qdez_ymh) 331

北斗导航 | 卡尔曼滤波与因子图优化对比(附图优化matlab代码)

- 历史数据利用:因子图通过滑动窗口保留历史状态,优化时联合多帧数据;卡尔曼滤波仅依赖当前和上一帧状态 。 - 迭代优化:因子图通过多次迭代逼近最优解,卡尔曼滤波仅单次更新 。 - 误差抑制:因子图的多次线性化可有效抑制非线性误差(如GNSS伪距观测的非线性) 。

尘世冰封的专栏 1299

CF911G Mass Change Queries

线段树,线段树标记

良月澪二的博客 457

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[CF911G] Mass Change Queries

线段树合并裸题 #include <bits/stdc++.h> const int N=2e5+5; int tot,rt[101],ans[N]; struct Node {int ls,rs;} t[N*200]; void insert(int&x,int l,int r,int p) { if(!x) x=++tot; if(l==r) retu...

weixin_30739595的博客 221

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

CF911G Mass Change Queries (线段树区间 合并)

题意: 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 题解: 100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y的这个数的集合里面不就可以了。线段树合并! 这样的话我们对于每一种颜色动态开一个线段树,合并就把颜色为x的线段树区间l r合并到颜色为y的线段树的区间l r 上即可。 之前大多数的线段树合并是整颗线段树进行合并,这个是针对于某段区间进行合并,我们需要稍微调整一下这个update即可。 最后只需要遍历一遍这100

xxxxxiao123的博客 1201

CF911G Mass Change Queries(线段树合并)

CF911G Mass Change Queries 观察,数组的值域不是很大,只有100,因此可以根据下标动态开点,修改,就是将权值为x的子树加到权值为y的树上去,还是比较好想 #include <bits/stdc++.h> #define inf 0x7fffffff #define ll long long //#define int long long //#define double long double #define re register int #define void i

lcl1234567890lcl的博客 232

[CF911G]Mass Change Queries

题目大意:给出一个数列$S(S_i\leqslant100)$,有$q$个操作,每种操作是把区间$[l,r]$中等于$x$的数改成$y$,输出答案 题解:线段树,每个节点存这段区间的每个值会变成什么,最后扫一遍就好了 卡点:无 C++ Code: #include <cstdio> #define maxn 200001 int s[maxn], ans[maxn...

weixin_34377919的博客 194

权值线段树(+动态开点)及其简单应用

它是个啥? 我们都知道,线段树是一种功能较为强大的数据结构。普通线段树中我们在每个节点存储的是某段区间的一些信息,而权值线段树,我们存的是值为该下标的数的个数,并通过线段树统计某段区间的信息。 它能干嘛? 最最简单的用途就是动态统计在某个取值范围内的数的个数嘛,而这就足够我们解决许多问题了,例如求前驱、后继等等。 它有什么限制? 通常出题人都不会特地去限制权值的范围,而如果我们非常草率地开出一棵线...

ChrysanDog的博客 1482

洛谷P3960 列队(动态开点权值线段树)

我们考虑每个人离队后对队列的影响,我们可以得出结论,只会对当前行和最后一行产生影响,我们先看在m的特殊情况。 第(m,i)的人从队伍中离开,跑到了最后一位,我们假设后面的人不往上补充,而是往后多了一个人,这时变成了(m,n+1),我们开一个vector来维护这个序列,而在线段树中,我们采用类似于前缀和的方式找位置,比如第(l+r)/2位空了,现在的前(l+r)/2位只有(l+r)/2-1位,那么我...

zwjqwq的博客 315

算法进阶--线段树(1)

考录到线段树的篇幅过多,写五六十页的观感不佳,我把它分为多个章节,大家可以关注我看后续的更新。每章节我会把涉及的内容放在前面,给大家进行选择和查找。(章节我会用红体来表示,内容我会用蓝体表示)。 本章会介绍:一般线段树(主要是模板),主席树(可持久化的线段树),二逼平衡树(树套树,线段树套平衡树)。

2302_79458117的博客 1653

动态开点权值线段树

动态开点权值线段树其实不用离散化,也不用关注负数,因为和负数没关系了 //#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define sz(a) (int)a.size() #define INF 0x3f3f3f3f #define DNF 0x7f7f7f7f #define DBG prin

Zenith_Habitant的博客 437

『权值动态开点线段树』『线段树合并算法』简单理解

权值线段树与动态开点 在正常的线段树中,我们总是以下表来进行线段树的操作。而权值线段树主要用于对具体的权值进行构造线段树,用于权值计数,权值操作等问题。 由于权值太大,我们不再采用完全二叉树的编号方式,使用类似于邻接表一样的存储方式,每一个节点只存储它儿子节点的编号;且只对有用区间进行开点操作,这样复杂度也是logloglog级别的。 例如,需要添加权值为为444的点,而总区间是[1,10][1,...

Ronaldo7_ZYB的博客 887
上一篇: 【CS61A】学习笔记
下一篇: 洛谷P4314 CPU【线段树】
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值