SPOJ COT2 树上的莫队算法,树上区间查询

树上 分块 莫队 题型小结 加 题集 前言最近接触到了树分块(大三才接触到了QAQ),然后打算总结下……普通莫队算法简单回顾一下普通的莫队算法,莫队算法是用来解决区间询问的算法,其把区间分成n√\sqrt n份,每份的大小是n√\sqrt n。把所有询问按其左端点所在区间为第一关键字,右端点按第二关键字排序,然后依次移动左右指针,处理相关询问。算法的时间复杂度在于当前区间的左右指针移动。左指针每次只会在块内移动,复杂度为O(q∗n√)O 阅读详情

题意:n个节点形成的一棵树。每个节点有一个值。m次查询,求出(u,v)路径上出现了多少个不同的数。

树上的莫队算法,同样将树分成siz=sqrt(n)块,然后离线操作。先对树dfs一遍,每当子树节点个数num>=siz,就将这num个分成一块。读取所有的查询按左端点所在块排序。

重点在于怎么进行区间转移,对路径的lca特殊处理,参考博客http://blog.youkuaiyun.com/kuribohg/article/details/41458639  


用倍增法求lca单次要用logn复杂度,要跑3200ms。有个地方可以优化,就是知道了所有的查询,也就是事先知道了转移路径,可以用离线的方法求O(n)求出所有需要用到的lca,这个写起来比较麻烦,不过可以优化到1800ns。代码写的比较挫。。。。

logn求lca:3200+ms

#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=4e4+10;
const int maxm=1e5+10;

int n,m, siz;
vector<int> g[maxn];
int a[maxn], b[maxn], ans[maxm];
int tot[maxn], in[maxn];
int fa[maxn][20], dep[maxn];

struct Query
{
    int l, r, id;
    int st,ed;
    bool operator <(const Query& a) const
    {
        return st!=a.st? st<a.st: ed<a.ed; //先按左端点所在块先后排序,其次考虑又右端点所在块
    }
};

Query q[maxm];
int tag, bel[maxn];
int st[maxn], top;
int dfs(int u, int par, int d, int &cnt)
{
    dep[u]=d; fa[u][0]=par;
    int num=0;
    for(int i=0; i<g[u].size(); i++){
        int v=g[u][i];
        if(v!=par){
            num+=dfs(v, u, d+1, cnt);
            if(num>=siz){ //子树大小>=sqrt(n),分成一块
                for(int i=0; i<num; i++)
                    bel[st[--top]]=tag;
                tag++;
                num=0;
            }
        }
    }

    st[top++]=u;//记录子树遍历的点
    return num+1;
}

void init()
{
    for(int i=0; i<=n; i++) g[i].clear();
    memset(tot, 0, sizeof(tot));
    memset(in, 0, sizeof(in));

    siz=sqrt(n);

    for(int i=1;i<=n; i++) scanf("%d",&a[i]), b[i]=a[i];
    sort(b+1, b+n+1);
    for(int i=1; i<=n; i++)
        a[i]=lower_bound(b+1, b+n+1, a[i])-b;

    for(int i=0; i<n-1; i++){
        int u,v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }

    int cnt=0; tag=top=0;
    int num=dfs(1, -1, 0, cnt);
    for(int i=0; i<num; i++)
        bel[st[--top]]=tag; //最后剩下的数也分成一块

    for(int i=1; i<20; i++){
        for(int u=1; u<=n; u++)
            if(fa[u][i-1]==-1)
                fa[u][i]=-1;
            else fa[u][i]=fa[fa[u][i-1]][i-1];
    }

    for(int i=0; i<m; i++){
        scanf("%d%d", &q[i].l, &q[i].r);
        if(bel[q[i].l]>bel[q[i].r])
            swap(q[i].l, q[i].r);
        q[i].id=i;
        q[i].st=bel[q[i].l];
        q[i].ed=bel[q[i].r];
    }
    sort(q, q+m);
}

int lca(int u, int v)
{
    if(dep[u]>dep[v]) swap(u, v);
    for(int i=0; i<20; i++)
        if((dep[v]-dep[u])>>i&1)
            v=fa[v][i];

    if(u==v) return u;
    for(int i=19; i>=0; i--){
        if(fa[u][i]!=fa[v][i]){
            u=fa[u][i];
            v=fa[v][i];
        }
    }
    return fa[u][0];
}

void solve()
{
    int res=0;
    int cu=1, cv=1;

    for(int i=0; i<m; i++){
        int nu=q[i].l, nv=q[i].r;
        int par=lca(cu, nu);
        while(cu!=par){
            if(in[cu]){
                if(--tot[a[cu]]==0)
                    res--;
            }
            else if(++tot[a[cu]]==1)
                res++;
            in[cu]^=1;
            cu=fa[cu][0];
        }

        cu=nu;
        while(cu!=par){
            if(in[cu]){
                if(--tot[a[cu]]==0)
                    res--;
            }
            else if(++tot[a[cu]]==1)
                res++;
            in[cu]^=1;
            cu=fa[cu][0];
        }
        cu=nu;


        par=lca(cv, nv);
        while(cv!=par){
            if(in[cv]){
                if(--tot[a[cv]]==0)
                    res--;
            }
            else if(++tot[a[cv]]==1)
                res++;
            in[cv]^=1;
            cv=fa[cv][0];
        }

        cv=nv;
        while(cv!=par){
            if(in[cv]){
                if(--tot[a[cv]]==0)
                    res--;
            }
            else if(++tot[a[cv]]==1)
                res++;
            in[cv]^=1;
            cv=fa[cv][0];
        }
        cv=nv;

        par=lca(cu, cv);
        ans[q[i].id]=res+(!tot[a[par]]);
    }
}

int main()
{
    while(scanf("%d%d", &n, &m)==2){
        init();
        solve();
        for(int i=0; i<m; i++)
            printf("%d\n", ans[i]);
    }
    return 0;
}


离线查询lca:1800+ms

#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;
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef pair<int,int> P;
#define fir first
#define sec second
const int maxn=4e4+10;
const int maxm=1e5+10;

int n,m, siz;
vector<int> g[maxn];
int first[maxn],ltot=0, nxt[6*maxm];
P lq[6*maxm];//所有需要查询的lca,lq[i].first保存v,second保存查询的id

int a[maxn], b[maxn], ans[maxm];
int tot[maxn], in[maxn], fa1[maxn];
int fa[maxn], lca[3*maxm], col[maxn];
int bel[maxn],st[maxn],top=0;
struct Query
{
    int l, r, id;
    int st,ed;
    bool operator <(const Query& a) const
    {
        return st!=a.st? st<a.st: ed<a.ed;
    }
};

Query q[maxm];
int tag;
int dfs(int u, int par, int &cnt)//分块
{
    fa1[u]=par;
    int num=0;
    for(int i=0; i<g[u].size(); i++){
        int v=g[u][i];
        if(v!=par)
            num+=dfs(v, u, cnt);
        if(num>=siz){
            for(int i=0; i<num; i++)
                bel[st[--top]]=tag;
            tag++;
            num=0;
        }

    }
    st[top++]=u;
    return num+1;
}

int find(int u)
{
    return fa[u]==u?u:(fa[u]=find(fa[u]));
}

int unite(int x, int y)
{
    x=fa[x];
    y=fa[y];
    fa[y]=x;
}


void dfs2(int u, int par)//离线查询所有lca
{
    col[u]=1;
    for(int i=first[u]; i!=-1; i=nxt[i]){
        int v=lq[i].fir, id=lq[i].sec;
        if(!col[v]) continue;
        else if(col[v]==1){
            lca[id]=v;
        }
        else{
            lca[id]=find(v);
        }
    }

    for(int i=0; i<g[u].size(); i++){
        int v=g[u][i];
        if(v!=par)
            dfs2(v, u);
    }
    col[u]=2;
    unite(par, u);
}

void add(int u, int v, int id)//查询m<=1e5,数比较多所以用前向星实现优化
{
    lq[ltot]=P(v,id);
    nxt[ltot]=first[u];
    first[u]=ltot++;
}

void init()
{
    for(int i=0; i<=n; i++) g[i].clear();
    memset(tot, 0, sizeof(tot));
    memset(in, 0, sizeof(in));

    siz=sqrt(n);

    for(int i=1;i<=n; i++) scanf("%d", a+i), b[i]=a[i];
    sort(b+1, b+n+1);
    for(int i=1; i<=n; i++)
        a[i]=lower_bound(b+1, b+n+1, a[i])-b;

    for(int i=0; i<n-1; i++){
        int u,v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }


    int cnt=0; top=0; tag=0;
    int num=dfs(1, -1, cnt);
    for(int i=0; i<num; i++)
        bel[st[--top]]=tag;

    for(int i=0; i<m; i++){
        scanf("%d%d", &q[i].l, &q[i].r);
        if(bel[q[i].l]>bel[q[i].r])
            swap(q[i].l, q[i].r);
        q[i].id=i;
        q[i].st=bel[q[i].l];
        q[i].ed=bel[q[i].r];
    }
    sort(q, q+m);

    cnt=0; ltot=0;
    memset(first, -1, sizeof(first));
    add(1, q[0].l, cnt);
    add(q[0].l, 1, cnt++);
    add(1, q[0].r, cnt);
    add(q[0].r, 1, cnt++);
    add(q[0].r, q[0].l, cnt);
    add(q[0].l, q[0].r, cnt++);
    //add(q[0].r, q[0].l, cnt++);


    for(int i=0; i<m-1; i++){
    add(q[i].l, q[i+1].l, cnt);//第i个查询左端点向第i+1个左端点转移,所以需要它们之间的lca
    add(q[i+1].l, q[i].l, cnt++);
    add(q[i].r, q[i+1].r, cnt);//第i个查询右端点向第i+1个右端点转移
    add(q[i+1].r, q[i].r, cnt++);
    add(q[i+1].r, q[i+1].l, cnt);//左端点和右端点的lca
    add(q[i+1].l, q[i+1].r,cnt++);
    }
    for(int i=0; i<=n; i++) fa[i]=i;
    memset(col, 0, sizeof(col));
    dfs2(1, 0);
}



void solve()
{
    int res=0;
    int cu=1, cv=1;

    for(int i=0; i<m; i++){
        int nu=q[i].l, nv=q[i].r;
        //cout<<lca[i*3]<<' '<<lca[i*3+1]<<' '<<lca[i*3+2]<<endl;
        int par=lca[i*3];
        while(cu!=par){
            if(in[cu]){
                if(--tot[a[cu]]==0)
                    res--;
            }
            else if(++tot[a[cu]]==1)
                res++;
            in[cu]^=1;
            cu=fa1[cu];
        }

        cu=nu;
        while(cu!=par){
            if(in[cu]){
                if(--tot[a[cu]]==0)
                    res--;
            }
            else if(++tot[a[cu]]==1)
                res++;
            in[cu]^=1;
            cu=fa1[cu];
        }
        cu=nu;


        par=lca[i*3+1];
        while(cv!=par){
            if(in[cv]){
                if(--tot[a[cv]]==0)
                    res--;
            }
            else if(++tot[a[cv]]==1)
                res++;
            in[cv]^=1;
            cv=fa1[cv];
        }

        cv=nv;
        while(cv!=par){
            if(in[cv]){
                if(--tot[a[cv]]==0)
                    res--;
            }
            else if(++tot[a[cv]]==1)
                res++;
            in[cv]^=1;
            cv=fa1[cv];
        }
        cv=nv;

        par=lca[i*3+2];
        ans[q[i].id]=res+(!tot[a[par]]);
    }
}

int main()
{
    while(cin>>n>>m){
        init();
        solve();
        for(int i=0; i<m; i++)
            printf("%d\n", ans[i]);
    }
    return 0;
}


【BlueDroid】【BLE】低功耗蓝牙客户端和服务端开发流程解析(超详细) 1. 精讲):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论2. 欢迎大家关注和订阅,和专栏会持续更新中.....敬请期待! 阅读详情

相关推荐

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 368

SPOJ COT2 Count on a tree II (树上莫队)

题意: 思路: &nbsp;&nbsp;&nbsp;&nbsp; 树上分块方法&lt;-由这个题,我们可以得出一种分块方法,他能保证每个块中内部移动次数,同时也能保证块的大小 &nbsp;&nbsp;&nbsp;&nbsp; 这个是讲述怎么转移的因为转移的时候,lca非常麻烦,要各种分类讨论,这个博客告诉我们,只要不管lca进行转移,最后计算结果的时候临时加上lca即可 错误及反思: ...

Roll_Keyboard的博客 371

将Matlab程序打包成.exe独立可执行程序

将Matlab程序打包成.exe独立可执行程序,在未安装Matlab的电脑上也能运行Matlab程序。

简简单单的学习笔记,致力于帮助更多前进路上的朋友~ 5万+

树上莫队算法

江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA。考虑上图中的树,其DFS序为其任意点对aa、bb之间的路径,具有如下性质,令lcalca为aa、bb的最近公共祖先: 若lcalca是aa、bb之一,则aa、bb之间的InIn时刻的区间或者OutOu

RBS的专栏 5875

射频微波电路设计【1.4】

AppCAD是一组射频设计工具和计算机应用说明,它使射频工程师能以更快和更容易的方式设计他们的产品。该软件的理 念是为工程师提供一个“个人设计助理”,即功能强大、快速和容易使用的辅助设计工具。该软件包括如下基本功能: ·各种传输线电气参数的分析与计算;·各种匹配电路的分析与计算;·各种有源和无源简单电路的分析与计算;·射频系统指标的计算:增益、噪声系数、三阶交调、信噪比、灵敏度等;·器件可靠性分析。

qq_43416206的博客 2319

如何给K8S配置一个具有永久有效的kubeconfig

在 Amazon EKS 环境中,Kubernetes 的认证机制与 AWS IAM 深度集成,通过aws-iam-authenticator动态生成临时凭证。这种设计虽然增强了安全性,但给需要持久化凭证的工具链(如 CI/CD 系统中的 KubeVela)带来了挑战。具体表现为:临时凭证失效​​:默认 Token 有效期为 15 分钟至 1 小时;​​IAM 角色限制​​:直接使用aws eks get-token生成的凭证无法持久化

小杨同学的博客 660

莫队算法(普通,带修,回滚,树上)

这是用来复习的博客,不太建议想要初学普通莫队的人看这篇博客,不过要是想快速复习一遍,这个博客可能比较适合你。 莫队算法(普通,带修,回滚) 莫队算法是一种通过对询问多关键字排序来降低时间复杂度的算法,当一些可离线题目满足 一个询问[l,r]的答案可以由[l-1,r]/[l+1,r]/[l,r-1]/[l,r+1]更新得到 时,可以考虑莫队算法。普通莫队不支持修改,不过如果是简单的修改可以用带修莫队/回滚莫队解决,至于树上问题则需要引入树上莫队,这里不做介绍(因为我也不会……)。实现简洁,应用面大,非常值得一

zixiangzhan的博客 2022

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析 openGauss学习笔记-280 ope

超哥的博客 308

【数据结构】树上莫队

树上莫队

conti123的博客 1097

科研——BIBM论文修改和提交

BIBM的相关操作流程汇总

Blackoutdragon的博客 6688

UG\NX二次开发 判断对象是虚线还是实线

网友提问“怎么区分虚线实线”,这个可以通过函数判断。

王牌飞行员_里海的博客 357

树上莫队、带修莫队

树上莫队,美其名曰在树上进行莫队操作,即区间维护、查询但之前的莫队都在线性区间操作,对于树上莫队,考虑转化树形结构为链式结构使用——

m0_71198491的博客 873

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

莫队练习

文章目录HDU-5145 NPY and girls [莫队][组合数][逆元]SPOJ-COT2 Count on a tree II [树上莫队]NBUT-1457 Sona [莫队]HDU-5213 Lucky [莫队][容斥] HDU-5145 NPY and girls [莫队][组合数][逆元] HDU-5145 NPY and girls 题意 每个女孩所在的班级为 a[i]a[i]a[i],NPY每次到一个班级只能拜访一个女孩,问NPY访问区间 [l,r][l,r][l,r] 里的女.

QAQ! 的博客 222

假人有限元模型

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SPOJ COT2(树上莫队)

You are given a tree with N nodes.The tree nodes are numbered from 1 to N.Each node has an integer weight. We will ask you to perfrom the following operation: u v : ask for how many different in

creatorx的博客 558

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

莫队算法小结

wtf,最近挖坑有点小多啊,没办法>_<容我先把糖果公园A了再来写这个吧= =看看今天能不能A掉好吧,我承认我第二天才把糖果公园A掉>_<下面把这篇小结补上首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料下面举几个例子详细说明1.小Z的袜子 Description:给定一个序列mm个询问每次询问:区间中选两个数,两个数相

mlzmlz95的专栏 2215

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[spoj COT2- Count on a tree II] 树上莫队

[spoj COT2- Count on a tree II]树上莫队分类:Mo's Algorithm 1. 题目链接[spoj COT2- Count on a tree II]2. 题意描述给一棵NN个节点的树,每个节点上有一个权值。然后MM次询问,查询从u→vu→v的路径上面的不同数的数目。 数据范围: N<=40000,M<=100000N <= 40000, M <= 1000003.

Fighting! 1206

【SPOJ】Count on a Tree Ⅱ (COT2)

Foreword既然今天把莫队算法给复习了,又要准备AC糖果公园,那么就把树上莫队也给再写一遍先吧……OverviewYou are given a tree with N nodes. The tree nodes are numbered from 1 to N. Each node has an integer weight.We will ask you to perfrom the fol

Sdchr 610

SPOJ Count on a tree II 树上莫队

https://vjudge.net/problem/SPOJ-COT2 题目大意:给一棵nnn个节点的数,每个节点有一种颜色,mmm个询问(u,v)(u,v)(u,v),你需要输出u、vu、vu、v这条链上的不同的颜色数目。 思路:如果这道题是在区间内询问的,相信大家都能看出来是莫队。在树上怎么搞呢?树上莫队。通过欧拉序把链转换成区间,然后就可以做了。树上莫队的思想这里不想重复了,不懂的可以看下...

xiji333的博客 313

spoj-cot2(树上莫队)

题解:因为是树上查询,我们可以在树上做下分块然后莫队,至于怎么分看你的技巧,我是先去学了一下联盟王国的树上分块据说那个操作的分块查询一块是sq~3sq的时间复杂度而且还是比较正统,所以我选择用那个分块,然后接着r我怎么操作呢,我们按dfs序,你会很神奇的发现如果我r按dfs操作的话我这里的操作时间复杂度大约是O(2×siz*n),siz是块数,然后转移怎么转移呢?你可以多画几个树形图自己尝试多种情...

Soul 701

「SPOJ COT2」Count on a tree II【树上莫队】

COT2 - Count on a tree II You are given a tree with NNN nodes. The tree nodes are numbered from 111 to NNN. Each node has an integer weight. We will ask you to perform the following operation: u ...

wzw 212

游戏AI搭子系统全解析:从猫娘到人格、记忆与事件联动

在人工智能与游戏产业深度融合的当下,打造具有陪伴感的AI角色逐渐成为提升玩家留存的关键手段。其核心并非简单的对话生成,而是围绕角色一致性、跨会话记忆与游戏事件感知构建的工程体系。一个合格的AI搭子需要具备稳定的人设配置、分层的长期记忆管理,以及能够实时响应玩家行为的事件联动机制。通过将角色配置结构化、记忆按重要性分级存储,并打通游戏事件到对话上下文的注入链路,即使是独立开发者也能基于大模型接口快速实现一个具备“专属感”的AI伙伴。本文将借鉴猫娘搭子的实际案例,拆解AI角色从Prompt设计到系统落地的完整路

weixin_34302561的博客 382

SPOJ COT2(Count on a tree II) 树上莫队

题意:给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u和v这两个节点间有多少种不同的点权。思路:1 点权比较大需要离散化。2 对这棵树求其dfs序分块,3 对m组询问的L和R求lca,4 莫队,lca需要特殊处理。#include &lt;bits/stdc++.h&gt; using namespace std; const int maxn=40050; cons...

XFire的博客 333

莫队算法笔记

莫队算法用于解决不带修改的离线区间问题。 其主要思想是这样的: 先已知区间[L,R]的答案为ans,如果求出区间[L+1,R],[L-1,R],[L,R-1],[L,R+1]的时间均为alpha(),那么就可以在alpha()的时间内转移一个单位区间,求出答案ans’。 因此,我们可以通过安排查询的顺序来使得转移次数尽量少。 可以用平面最小曼哈顿距离生成树来确定查询顺序,不过有一个更好写的方

Quack 1606

[SPOJ COT2]-Count on a tree II-树上莫队

说在前面 乘着这几天大力填补之前留下的坑… 树上分块果然还是使用 王室联邦法 最好了=w= 题目 SPOJ COT2传送门 题目大意 给定一棵有N个节点的树,树上的节点都有各自的权值 现在给出M个询问,询问u到v的路径上有多少种不同的权值 输入输出格式 输入格式: 第一行两个整数N,M 接下来N-1行,每行两个整数表示树边连接的点 再接下来M行,每行两个数u,v

泉華子的OI足迹 408

SPOJ 10707 COT2 - Count on a tree II

思路 树上莫队的题目 每次更新(u1,u2)和(v1,v2)(不包括lca)的路径,最后单独统计LCA即可 代码 #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <cmath> using namespace std; ...

weixin_34061482的博客 121
上一篇: hdu 5381 莫队算法/gcd
下一篇: hdu 4418 高斯消元+概率dp
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值