主席树(可持久化线段树)入门专题

可持久化线段树(主席树) 摘要 主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。 主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。 本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。 可持久化数据结构 可持久数据结构... 阅读详情

1.poj 2104 查询区间第k小。

主席树其实相当于建立了n棵线段树,第i棵线段树是根据区间【1,i】按值建立的。对于每一棵线段树我们记录它对应的区间每个数出现的次数,所以首先要对所有的数离散化。

先考虑最简单的情况,只查询【1,n】的第k小,对于【1,n】我们按值建立一棵线段树,对于a[i]我们在位置a[i]上加1。查询第k小那么先看左子区间出现了多少个数cnt,假设左区间出现的数cnt>=k,那么直接递归到左区间查询(因为是按值建立的,左区间的数肯定小于右区间),否则递归到右区间查询第k-cnt小(左区间已经有了最小的cnt个数了)


对于任意区间查询【l,r】,我们只需要比较第l-1棵线段树和第r棵线段树,【l,r】之间的数就是第r棵线段树相比于第l-1棵多出来的数。只需要对比两颗树同一个节点,对比到哪个数为止第r棵比第l-1棵刚好多出k个数。(先比较左区间cntr-cntl,cntr-cntl>=k,则递归到左区间,否则递归查询右区间k-cntr-cntl)


主席树就相当于n棵线段树,但是对比建立在【1,i】的线段树和【1,i+1】的线段树,只多出了一个值,也就是相当于单点更新他们之间只有logn个节点是不同的,所以可以将【1,i+1】的一些节点指针指向前一棵的共同部分。每次新增的空间只需要logn。


代码是根据kuangbin模板抄的。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;

const int maxn=1e5+10;
const int M=maxn*30;

int n,q,m,tot;
int a[maxn], t[maxn];
int T[maxn], lson[M], rson[M], c[M];

void init_hash()
{
    for(int i=1; i<=n; i++)
        t[i]=a[i];
    sort(t+1, t+n+1);
    m=unique(t+1, t+n+1)-t-1;
}

int hash(int x)
{
    return lower_bound(t+1, t+1+m, x)-t;
}

int build(int l, int r)
{
    int rt=tot++;
    c[rt]=0;
    if(l!=r){
        int mid=(l+r)>>1;
        lson[rt]=build(l,mid);
        rson[rt]=build(mid+1, r);
    }
    return rt;
}


int update(int rt, int pos, int val)
{
    int newrt=tot++,tmp=newrt;
    c[newrt]=c[rt]+val;
    int l=1, r=m;
    while(l<r){
        int mid=(l+r)>>1;
        if(pos<=mid){
            lson[newrt]=tot++; rson[newrt]=rson[rt];
            newrt=lson[newrt]; rt=lson[rt];
            r=mid;
        }
        else{
            rson[newrt]=tot++; lson[newrt]=lson[rt];
            newrt=rson[newrt]; rt=rson[rt];
            l=mid+1;
        }
        c[newrt]=c[rt]+val;
    }
    return tmp;
}

int query(int lrt, int rrt, int k)
{
    int l=1, r=m;
    while(l<r){
        int mid=(l+r)>>1;
        if(c[lson[lrt]]-c[lson[rrt]]>=k){
            r=mid;
            lrt=lson[lrt];
            rrt=lson[rrt];
        }
        else{
            l=mid+1;
            k-=c[lson[lrt]]-c[lson[rrt]];
            lrt=rson[lrt];
            rrt=rson[rrt];
        }
    }

    return l;
}

int main()
{
    while(cin>>n>>q){
        
        for(int i=1; i<=n; i++)
            scanf("%d", a+i);
        init_hash();
        tot=0;
        T[n+1]=build(1,m);

        for(int i=n; i; i--){
            int pos=hash(a[i]);
            T[i]=update(T[i+1], pos, 1);
        }
        while(q--){
            int l,r,k;
            scanf("%d%d%d", &l, &r, &k);
            printf("%d\n", t[query(T[l], T[r+1], k)]);
        }
    }
    return 0;
}



2.hdu 4417 区间查询<=H的数有多少个

查询【l,r】区间只需要将第r棵线段树【0,H】区间的总数减去第l-1棵的就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
const int maxm=maxn*30;

int n,m, N;
int a[maxn],b[2*maxn];
int T[maxn],tot;
int lson[maxm],rson[maxm], cnt[maxm];

int build(int l, int r)
{
    int rt=tot++;
    cnt[rt]=0;
    if(l==r) return rt;
    int mid=(l+r)>>1;
    lson[rt]=build(l, mid);
    rson[rt]=build(mid+1, r);
    return rt;
}


int update(int rt, int pos, int v)
{
    int newrt=tot++, ret=newrt;
    int l=1, r=N;
    cnt[newrt]=cnt[rt]+v;
    while(l<r){
        int mid=(l+r)>>1;
        if(pos<=mid){
            lson[newrt]=tot++; rson[newrt]=rson[rt];
            newrt=lson[newrt]; rt=lson[rt];
            r=mid;
        }
        else{
            lson[newrt]=lson[rt]; rson[newrt]=tot++;
            newrt=rson[newrt]; rt=rson[rt];
            l=mid+1;
        }
        cnt[newrt]=cnt[rt]+v;
    }

    return ret;
}


int query(int lrt, int rrt, int pos)
{
    int ret=0;
    int l=1,r=N;
    while(l<r){
        int mid=(l+r)>>1;
        if(pos<=mid){
            lrt=lson[lrt]; rrt=lson[rrt];
            r=mid;
        }
        else{
            ret+=cnt[lson[rrt]]-cnt[lson[lrt]];
            lrt=rson[lrt]; rrt=rson[rrt];
            l=mid+1;
        }
    }
    ret+=cnt[rrt]-cnt[lrt];
    return ret;
}


int l[maxn], r[maxn], h[maxn];
int main()
{
    int t;
    cin>>t;
    for(int tt=1; tt<=t; tt++){
        cin>>n>>m;
        for(int i=1; i<=n; i++){
            scanf("%d", a+i);
            b[i]=a[i];
        }

        for(int i=0; i<m; i++){
            scanf("%d%d%d", l+i, r+i, h+i);
            b[n+1+i]=h[i];
        }
        sort(b+1, b+1+n+m);
        N=unique(b+1, b+1+n+m)-b-1;

        tot=0;
        T[0]=build(1,N);
        for(int i=1; i<=n; i++){
            int v=lower_bound(b+1, b+1+N, a[i])-b;
            T[i]=update(T[i-1], v, 1);
        }

        printf("Case %d:\n", tt);
        for(int i=0; i<m; i++){
            int v=lower_bound(b+1, b+1+N, h[i])-b;
            printf("%d\n", query(T[l[i]], T[r[i]+1], v));
        }


    }
    return 0;
}



3.hdu 4348 可持久化线段树,区间更新,不下放的懒惰标记(空间优化)

主席树其实就是可持久化线段树。可持久化就是每次修改操作,尽量用新节点表示而不是直接修改原来的点,这样所有的历史版本都得以保留。

主要麻烦的就是区间更新。区间更新对于完全覆盖的区间要用lazy标记。但是每次lazy下放的时候两个子区间都发生修改需要创造两个新的节点,这样到最后下放到最后一层相当于消耗了O(n)个新节点,空间会爆。

这道题用的空间优化就是不下放标记。标记就打在那个区间节点上,而查询的时候,往下递归时遇到标记就累加,最后把标记的影响加到总答案里。这样就不需要创造那么多新节点了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn=1e5+1000;
const int maxm=30*maxn;
typedef long long LL;
int n, m;
int a[maxn];
int T[maxn], tot=0;
int lson[maxm],rson[maxm], lazy[maxm];
LL sum[maxm];

void push_up(int rt, int l, int r)
{
    sum[rt]=sum[lson[rt]]+sum[rson[rt]]+(LL)lazy[rt]*(r-l+1);
}


int build(int l, int r)
{
    int rt=tot++;
    lazy[rt]=0;
    if(l==r){
        sum[rt]=a[l];
        return rt;
    }

    int mid=(l+r)>>1;
    lson[rt]=build(l,mid);
    rson[rt]=build(mid+1, r);
    push_up(rt, l, r);
    return rt;
}

int update(int rt, int l, int r, int ll, int rr, int v)
{
    int newrt=tot++;
    lazy[newrt]=lazy[rt];
    if(ll<=l && r<=rr){
        lson[newrt]=lson[rt], rson[newrt]=rson[rt];
        lazy[newrt]=lazy[rt]+v;
        sum[newrt]=sum[rt]+(LL)v*(r-l+1);
        return newrt;
    }


    int mid=(l+r)>>1;
    if(rr<=mid){
        rson[newrt]=rson[rt];
        lson[newrt]=update(lson[rt], l, mid, ll, rr, v);
    }
    else if(ll>mid){
        lson[newrt]=lson[rt];
        rson[newrt]=update(rson[rt], mid+1, r,ll, rr, v);
    }
    else{
        lson[newrt]=update(lson[rt], l, mid, ll, mid, v);
        rson[newrt]=update(rson[rt], mid+1, r, mid+1, rr, v);
    }

    push_up(newrt, l, r);
    return newrt;
}


LL query(int rt, int l, int r, int ll, int rr, int  la)
{

    if(ll<=l && r<=rr){
        return sum[rt]+(LL)la*(r-l+1);
    }
    la+=lazy[rt];

    int mid=(l+r)>>1;
    if(rr<=mid)
        return query(lson[rt], l, mid, ll, rr, la);
    else if(ll>mid)
        return query(rson[rt], mid+1, r, ll, rr, la);
    else
        return query(lson[rt], l, mid, ll, mid, la)+query(rson[rt], mid+1, r, mid+1, rr, la);
}


int main()
{
    while(cin>>n>>m){
        for(int i=1; i<=n; i++)
            scanf("%d", a+i);

        tot=0;
        T[0]=build(1,n);
        int tag=0;
        while(m--){
            char s[5];
            int l,r,d;
            scanf("%s%d", s, &l);
            if(s[0]=='B'){
                tag=l;
            }
            else{
                scanf("%d", &r);
                if(s[0]=='Q'){
                    LL res=query(T[tag], 1, n, l, r, 0);
                    printf("%I64d\n", res);
                }
                else{
                    scanf("%d", &d);
                    if(s[0]=='C'){
                        tag++;
                        T[tag]=update(T[tag-1], 1, n, l, r, d);
                    }
                    else{
                        LL res=query(T[d], 1, n, l, r, 0);
                        printf("%I64d\n", res);
                    }
                }
            }
        }
    }
    return 0;
}



可持久化专题(一)——浅谈主席树:可持久化线段树 前言 不得不说,可持久化数据结构真是太难了! 由于数据结构这东西真的太玄学了,学这个主席树我真的学了很久。 简介 主席树为什么叫主席树?据说因为它是一个名字缩写为HJTHJTHJT的神犇发明的,与当时主席的名字缩写一样…… 主席树实质上就是一棵可持久化线段树,它的具体实现可以看下面。 让我们从值域线段树开始说起 要学主席树,我们就要先学值域线段树。 值域线段树的区间存的并不... 阅读详情

相关推荐

可持久化线段树(主席树)详解(c++ 图片演示+ 代码)

对于一颗权值线段树,我们要往里面添加n个数字,我们知道,这很容易实现,只需要一个for循环,然后调用n次update函数即可(update函数具有添加元素的功能,详见《权值线段树博文》)。,以便于我们对历史的操作,那么如果只使用权值线段树,则我们需要n个权值线段树同时保存状态,对于非常多的元素,我们就需要。我们前面提到过,每一个根可以组成一个单独的线段树,而每一个根节点都可以用一个唯一的编号表示。这种问题具有非常明显的优势,前面我们说过权值线段树也可以处理区间第k大,但是权值线段树必须是。

ylh的博客 4771

可持久化线段树(主席树) --算法竞赛专题解析(27)

可持续化线段树(主席树):来历、经典题、模板

罗勇军的博客 6134

可持久化线段树(主席树)及可持久化数组

定义:可以访问历史版本的线段树为可持久化线段树 B站讲解视频:【AgOHの数据结构】主席树 可持久化线段树之所以可以访问历史版本,是因为宏观上看,它为每个版本维护了一棵树。当然,如果真的对每个版本建一颗树,时间空间复杂度都hold不住。所以建立i版本的树时,如果某颗子树相对于i-1版本没有变化,就可以直接使其父亲对应的指针指向i-1版本的这颗子树。 主席树更多的用于单点更新问题,可以为每一次更新后的版本建立一棵树,递归更新的过程中,先令当前节点等于上一个版本的节点,如果某个子树要更新,则新开一个空间存放.

bensanhuan的博客 679

主席树详解(基础)

可持久化线段树,又称主席树,本文详解它的构成和基础用法

nxhx_的博客 4661

使用 ArcGIS Pro 和 Google Earth Engine 可视化地表温度

在这项研究中,利用 Landsat 热数据通过各种方法检查了 2013 年和 2023 年恰纳卡莱省的地表温度变化。使用了 NDVI、大气层顶部、亮度温度、植被比例和地表温度等公式。研究结果表明,从热图像中获得的数据,特别是地表温度(LST),是土地解释的重要资源。恰纳卡莱 — 土耳其(土耳其)使用 ArcGIS 程序和 Google Earth Engine 对不同季节的卫星图像进行分析。

gis收藏家的博客 1991

当Flowable遇上AI:智能流程决策的未来探索

本文探讨了Flowable工作流引擎与AI技术的融合,构建智能流程决策系统的前沿实践。通过动态流程控制、机器学习优化表达式、自然语言生成规则等创新方法,显著提升业务流程的自动化水平和决策效率。重点解析了AI如何赋能Flowable核心引擎,实现从静态规则到动态智能的跨越式发展。

weixin_29271053的博客 392

可持久化线段树【主席树】详解

首先科普下为什么叫主席树呢,这是因为主席树的创始人是一位叫做黄嘉泰的大佬,然后这位大佬名字的缩写是HJT,和某位伟人的名字缩写一样....haha,所以就有了主席树这个说法啦。 其实网上已经有很多博主写了关于主席树详解的博客了,但是我自己为什么还要手敲这样一份主席树教学呢?因为我在刚学主席树的时候,也是看了很多博主写的入门教程,但是没有任何单独一份就能让我搞明白什么是主席树,让我吃了很多苦头,所...

KnightHONG的博客 1795

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 443

可持久化线段树

在讲述可持久化线段树之前,大家需要先知道线段树是什么,如果还有不知道线段树的小伙伴可以看下我之前写的关于线段树的模板,在这附上博客地址:(63条消息) 线段树模板_AC__dream的博客-优快云博客 我们知道线段树支持修改和查询操作,假如我们现在要对某个历史版本的线段树进行操作,我们应该如何达到目的呢?最简单粗暴的方法就是对于每一次修改操作,我们都将原来的线段树先复制一份,再在新建立的线段树上进行操作,这样我们就可以对之前的任何一个版本的线段树进行操作,但是这样显然是不可取的,无论是时间复杂度上还是空

AC__dream的博客 868

macOS 发票查验全攻略:从证书导入到Safari调试

本文详细介绍了在macOS上进行发票查验的全流程,包括证书下载、钥匙串访问导入、Safari浏览器调试等关键步骤。重点解决了验证码不显示等常见问题,提供了证书信任设置和开发者工具使用的实用技巧,帮助用户顺利完成税务发票在线查验。

weixin_29204749的博客 545

七自由度机械臂逆运动学实战:从几何简化到KDL库高效求解

本文深入探讨了七自由度机械臂逆运动学求解的实战方法。针对冗余自由度带来的挑战,文章对比了两种核心方案:一是利用任务约束进行几何简化,快速求解特定任务;二是基于DH参数法配置KDL库,实现通用高效的数值迭代求解。文中结合宇树H1机器人实例,详细阐述了从模型解析、参数提取到代码实现与验证的全流程,并提供了几何法与KDL库的适用场景对比与避坑指南。

weixin_29044713的博客 636

主席树入门详解

简介 主席树全称应为可持久化权值线段树,可用于解决区间第k小问题。但可能由于这个的影响力比较大,现在主席树也被泛指为可持久化线段树。 主席树树是由NOI选手黄嘉泰(HJT,咱也不敢说)首先使用的。黄嘉泰原话:“这种求k 大的方法(函数式线段树)应该是我最早开始用的”。 可持久化线段树 可持久化数据结构 (Persistent data structure) 是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 可持久化线段树即保留多个历史版本(第k个版本即第k次修改后,第k+1次版本

SCUEC__zhazhahui的博客 1346

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

可持久化线段树 主席树 详解

可持久化线段树 主席树 详解 一、可持久化线段树 简介 可持久化线段树,顾名思义,即对线段树进行可持久化处理之后的线段树。 在可持久化数据结构的理论中,我们对可持久化的概念有所了解:“可以返回之前的某个状态,并在该基础上进行修改”。

HeartFireY的博客 2417

实战案例四:Claude Code + Excel 技能处理表格数据

Excel 是商业世界中最通用的数据工具。无论是财务报表、销售数据还是项目计划,Excel 无处不在。本案例将展示如何利用 Claude Code 的 Excel 技能,自动化处理复杂的表格数据,告别繁琐的手工操作。

gaoxiang_120的专栏 475

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4452

主席树(可持久化线段树)

2019.11.4 今天总算弄会主席树了,发现确实不难,但是需要跳出常规线段树的思维,特别是处理子树上面 主席树的定义与作用 主席树,也称可持久化线段树,那么什么是可持久化线段树呢,即为一颗记录了所有更新过程的线段树。能够处理出从第i次更新到第j次更新的线段树变化,具体作用一会见例题。 主席树的功能 记录所有过程的线段树,按正常思维是需要开O(N*M)这么大的空间的,时间也为O(n*m),...

孙煜晗的博客 7009

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

你会抄作业吗?巧了,我正在这么干

1202

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

权值线段树、主席树学习

初学主席树,主要是反复看了卿学姐的视频(我竟然在B站学算法)和知乎“主席树是如何求区间k大的”,才算懂了点皮毛。 传送门: 卿学姐的B站视频 知乎-“主席树是如何求区间k大的” 首先,学习主席树要点的前置技能是权值线段树(卿学姐说的是线段树,个人认为不太确切)。权值线段树之所以会带上“权值”二字,是因为它是记录权值的线段树。因此需要用到离散化操作来处理a[1-n]。记录权值指的是,每...

Stupid_Turtle的博客 9692

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

可持久化线段树——主席树

文章目录 可持久化前提:本身的拓扑结构不变

Cauchy的博客 962

可持久化数据结构-线段树(主席树)

可持久化线段树的概念和简单运用

zje11的博客 2741

[note]可持久化权值线段树(主席树)算法学习笔记

学习主席树,你需要先掌握:线段树概念、写法权值线段树离散化一道经典的问题是:给定 n个整数构成的序列,将对于指定的闭区间 [l,r] 查询其区间内的第 k小值。我们发现因为是k小值所以ST表失效无法使用,普通线段树也无法维护区间第k小的值,我们可以用可持久化权值线段树(主席树来解决这个问题。

weixin_43720735的博客 2226

可持久化线段树/主席树

具体来说,可持久化线段树是可以保存所有历史版本的线段树,每次插入,都会创建一颗新树,保存这次插入后版本的线段树,返回这个版本的线段树根节点,后面想查询一个历史版本时,就使用这个版本的根节点,进行线段树查询就行了,具体查询和线段树正常查询完全一样。个点,线段树中剩余的点其实完全没有变化,那其实我们可以在每次插入时,只对受到影响的点创建新的版本,然后接到未受影响的点上,这样每次插入,创建新版本的复杂度就是。小于左子树的元素个数,就进入左子树,否则进入右子树,知道来到叶节点,就是我们要找的元素的值。

Maxwell_Newton的博客 946

主席树(可持久化线段树)入门详解

一.问题引入. 当我们遇到要求快速查询区间的问题时,通常用线段树、平衡树等数据结构维护这类问题.但是使用这些数据结构的前提是要求区间信息可以快速合并(例如O(1)O(1)O(1)或O(log⁡n)O(\log n)O(logn)合并),还有很多问题是不可以这样做的,例如区间第k小的问题. 区间第k小问题可以使用很多数据结构来解决,例如划分树、归并树、分块、树套树等数据结构来解决,然而这些数据结构一...

hzk_cpp的博客 823

可持久化线段树解释(又叫主席树,可持久化数组)洛谷3919 3402

因为我是菜鸡,如果有说错的话,恳请大佬们指出 QAQ 本文分为以下几部分: 一:名称的由来 二:原理解释 三:代码怎么写 四:例题 名称的由来 首先,可持久化线段树,分为:可持久化+线段树。 可持久化就是历史信息回顾的意思。比如每次操作我都让某个数改变,那么我想回顾第k次操作,第i个是什么数应该怎么做呢?naive的做法就是我每改变一个数都复制一次这个数组就可以了,但是我们发现其实...

FrostMonarch的博客 413
上一篇: zoj 2112 Dynamic Rankings 带修改区间第k大的几种解法
下一篇: hdu 5381 莫队算法/gcd
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值