【CSP-S 2019】【洛谷P5665】划分【单调队列dp】

【JZOJ6434】【luoguP5665】【CSP-S2019】划分 description analysis 首先有一个结论,对于[1,i][1,i][1,i]区间划分最后一段的和尽量小,答案会更优,具体证明参考毛爷爷的博客 设f[i]f[i]f[i]为满足[1,i][1,i][1,i]划分最优时、(f[i],i](f[i],i](f[i],i]这段和最小时的最右的端点,最优划分即为从nnn开始向fff不断统计 由后一段比前一段大可知sum[f[... 阅读详情

前言

c s p csp csp时发现自己做过类似这道题的题目 : P4954 [USACO09Open] Tower of Hay 干草塔
然后回忆了差不多 15 m i n 15min 15min才想出来。。。
然后就敲了 88 p t s 88pts 88pts的部分分。当时的内存是 950 M B 950MB 950MB左右,写一个高精就炸内存了。


题目

2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。这个题的样例有 n n n 组数据,数据从 1 ∼ n 1 \sim n 1∼n 编号, i i i 号数据的规模为 a i a_i ai​。

小明对该题设计出了一个暴力程序,对于一组规模为 u u u 的数据,该程序的运行时间为 u 2 u^2 u2。然而这个程序运行完一组规模为 u u u 的数据之后,它将在任何一组规模小于 u u u 的数据上运行错误。样例中的 a i a_i ai​ 不一定递增,但小明又想在不修改程序的情况下正确运行样例,于是小明决定使用一种非常原始的解决方案:将所有数据划分成若干个数据段,段内数据编号连续,接着将同一段内的数据合并成新数据,其规模等于段内原数据的规模之和,小明将让新数据的规模能够递增。

也就是说,小明需要找到一些分界点 1 ≤ k 1 < k 2 < ⋯ < k p < n 1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n 1≤k1​<k2​<⋯<kp​<n,使得

∑ i = 1 k 1 a i ≤ ∑ i = k 1 + 1 k 2 a i ≤ ⋯ ≤ ∑ i = k p + 1 n a i \sum_{i=1}^{k_1} a_i \leq \sum_{i=k_1+1}^{k_2} a_i \leq \cdots \leq \sum_{i=k_p+1}^{n} a_i i=1∑k1​​ai​≤i=k1​+1∑k2​​ai​≤⋯≤i=kp​+1∑n​ai​

注意 p p p 可以为 0 0 0 且此时 k 0 = 0 k_0 = 0 k0​=0,也就是小明可以将所有数据合并在一起运行。

小明希望他的程序在正确运行样例情况下,运行时间也能尽量小,也就是最小化

( ∑ i = 1 k 1 a i ) 2 + ( ∑ i = k 1 + 1 k 2 a i ) 2 + ⋯ + ( ∑ i = k p + 1 n a i ) 2 (\sum_{i=1}^{k_1} a_i)^2 + (\sum_{i=k_1+1}^{k_2} a_i)^2 + \cdots + (\sum_{i=k_p+1}^{n} a_i)^2 (i=1∑k1​​ai​)2+(i=k1​+1∑k2​​ai​)2+⋯+(i=kp​+1∑n​ai​)2

小明觉得这个问题非常有趣,并向你请教:给定 n n n 和 a i a_i ai​,请你求出最优划分方案下,小明的程序的最小运行时间。


思路:

假设我们现在已经划分为三个部分 x , y , z x,y,z x,y,z满足 x ≤ y ≤ z x\leq y\leq z x≤y≤z,那么显然是有
x 2 + y 2 + z 2 < x 2 + ( y + z ) 2 x^2+y^2+z^2<x^2+(y+z)^2 x2+y2+z2<x2+(y+z)2
所以我们肯定要做到能分就分。
但是贪心选取肯定是错误的。样例一明显就指出了错误。
考虑 d p dp dp。设 f [ i ] f[i] f[i]表示我们划分 1 ∼ i 1\sim i 1∼i的所有数,以 i i i为最后一个区块的情况下,最后一个区块的最小长度。
那么枚举一个 j j j,明显有
f [ i ] = m i n ( ∑ k = j i a k )     ( ∑ k = j i a k ≥ f [ j ] ) f[i]=min(\sum^{i}_{k=j}a_k)\ \ \ (\sum^{i}_{k=j}a_k\geq f[j]) f[i]=min(k=j∑i​ak​)   (k=j∑i​ak​≥f[j])
由于 ∑ k = j i a k \sum^{i}_{k=j}a_k ∑k=ji​ak​满足单调性,所以肯定选择尽量大的 j j j来转移。
如果 j j j可以转移到 i i i,那么转移的同时可以求出划分的费用
a n s [ i ] = a n s [ j − 1 ] + ( ∑ k = j i a k ) 2 ans[i]=ans[j-1]+(\sum^{i}_{k=j}a_k)^2 ans[i]=ans[j−1]+(k=j∑i​ak​)2
这样我们就得到了一个 O ( n 2 ) O(n^2) O(n2)的算法,可以得到 64 p t s 64pts 64pts的高分。
我们发现,转移的条件 ∑ k = j i a k ≥ f [ j ] \sum^{i}_{k=j}a_k\geq f[j] ∑k=ji​ak​≥f[j]其实就是 ∑ k = 1 i a k − ∑ k = j i a k ≥ f [ j ] \sum^i_{k=1}a_k-\sum^i_{k=j}a_k\geq f[j] ∑k=1i​ak​−∑k=ji​ak​≥f[j],移项就得到了 ∑ k = 1 i a k ≥ f [ j ] + ∑ k = j i a k \sum^i_{k=1}a_k\geq f[j]+\sum^i_{k=j}a_k ∑k=1i​ak​≥f[j]+∑k=ji​ak​
我们发现,在做了前缀和之后,上式等号左边只与 i i i有关,等号右边只与 j j j有关。同时我们又要满足选择尽量大的 j j j来转移,所以就可以维护一个单调队列装 f [ j ] + ∑ k = j i a k f[j]+\sum^i_{k=j}a_k f[j]+∑k=ji​ak​进行转移。
但是我们每次要选择的是满足 ∑ k = 1 i a k ≥ f [ j ] + ∑ k = j i a k \sum^i_{k=1}a_k\geq f[j]+\sum^i_{k=j}a_k ∑k=1i​ak​≥f[j]+∑k=ji​ak​的尽量大 j j j进行转移,而不是单纯的最小的 ∑ k = 1 i a k ≥ f [ j ] + ∑ k = j i a k \sum^i_{k=1}a_k\geq f[j]+\sum^i_{k=j}a_k ∑k=1i​ak​≥f[j]+∑k=ji​ak​转移。所以我们每次要不断弹出队头,知道队头不再满足 ∑ k = 1 i a k ≥ f [ j ] + ∑ k = j i a k \sum^i_{k=1}a_k\geq f[j]+\sum^i_{k=j}a_k ∑k=1i​ak​≥f[j]+∑k=ji​ak​。此时将最后一次弹出的元素再从头部插入进行转移。这样就保证了每次选择 j j j最大的满足条件的元素进行转移。容易证明,弹出的元素不会对后面的转移产生影响。
这样每个元素最多进入队列1次,时间复杂度 O ( n ) O(n) O(n)。
这样我们就得到了 88 p t s 88pts 88pts的高分。
对于 t y p e = 1 type=1 type=1的数据点需要使用高精,但是由于 O ( n ) O(n) O(n)的算法我们的内存已经使用了 950 M B 950MB 950MB,所以几乎没有空间来敲高精。
所以此时就只能用csp不允许使用的__int128了
我们将 a n s ans ans改为 _ _ i n t 128 \_\_int128 __int128类型,是可以存下最终答案的。
然后我就愉快的T了。
在这里插入图片描述
在尝试过所有我知道的化学性卡常后,样例三依然需要 2.4 s + 2.4s+ 2.4s+才可以跑过。
所以此时就只能用csp不允许使用的Ofast了
物理性卡常 n b nb nb!样例最终可以在 0.85 s 0.85s 0.85s左右跑过。
然后我就愉快的MLE了。
在这里插入图片描述
经过输出后, a n s , f , s u m ans,f,sum ans,f,sum三个数组加起来是 1200 + M B 1200+MB 1200+MB。将近 200 M B 200MB 200MB的差距,只能考虑删除一个数组了。
a n s ans ans和 s u m sum sum是肯定无法删除的,而 f f f我们发现,在转移时是等于 s u m [ i ] − s u m [ l a s t ] sum[i]-sum[last] sum[i]−sum[last]的,其中 l a s t last last直可以转移的最大的 j j j。
所以我们考虑直接用 s u m sum sum数组来表示出 f f f数组。这样我们往单调队列插入时就要插入 i , f i + s u m i i,f_i+sum_i i,fi​+sumi​两维,因为后者在去掉 f f f数组后是没办法算出来的。
最终还是以 1.38 s , 804.98 M B 1.38s,804.98MB 1.38s,804.98MB过了这道题。但是在 c s p csp csp时是不允许用 _ _ i n t 128 \_\_int128 __int128和 O f a s t Ofast Ofast的,所以其实这份代码无论是时间还是空间都是过不去的


代码:

#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#define mp make_pair
using namespace std;
typedef long long ll;

const int N=40000010,MOD=(1<<30),M=100010;
int n,x,type,cnt,id;
ll d,xx,yy,zz,m,sum[N],b[4],p[M],l[M],r[M];
__int128 ans[N];
pair<int,ll> last;
char ch;
deque<pair<int,ll> > q;

inline ll read()
{
	d=0; ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch))
		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

inline void write(__int128 x)
{
	if (x>9) write(x/10);
	putchar(x%10+48);
}

inline ll Get(int i)
{
	int id=(i-1)%3+1;
	if (i>2 && id==1) b[1]=(xx*b[3]+yy*b[2]+zz)%MOD;
	if (i>2 && id==2) b[2]=(xx*b[1]+yy*b[3]+zz)%MOD;
	if (i>2 && id==3) b[3]=(xx*b[2]+yy*b[1]+zz)%MOD;  //减少模运算次数
	if (i>p[cnt]) cnt++;
	return (b[id]%(r[cnt]-l[cnt]+1))+l[cnt];
}

int main()
{
	scanf("%d%d",&n,&type);
	if (type)
	{
		xx=read(); yy=read(); zz=read(); b[1]=read(); b[2]=read(); m=read();
		for (int i=1;i<=m;i++)
			p[i]=read(),l[i]=read(),r[i]=read();
	}	
	q.push_back(mp(0,0));
	for (register int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+(type?Get(i):read());
		while (q.size() && sum[i]>=q.front().second)
		{
			last=q.front();
			q.pop_front();
		}
		q.push_front(last);
		int pos=last.first;
		ans[i]=ans[pos]+(__int128)(sum[i]-sum[pos])*(sum[i]-sum[pos]);
		while (q.size() && q.back().second>=sum[i]-sum[pos]+sum[i]) q.pop_back();
		q.push_back(mp(i,sum[i]-sum[pos]+sum[i]));
	}
	write(ans[n]);
	return 0;
}
C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug C 思路 算法:队列,模拟。 重点:读入每一张有效优惠券的终止时间,价格。 模拟每一条公交车记录是否可以用票抵消。 如果可以,用最早的有效优惠票。 否则,用钱买车票。 Code: #include<iostream> #include<cstdio> using namespace std; struct piao { int p; int t; }; piao a[100005]; int n; i 阅读详情

相关推荐

题解:洛谷 P5665 [CSP-S 2019] 划分

题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。不一定递增,但小明又想在不修改程序的情况下正确运行样例,于是小明决定使用一种非常原始的解决方案:将所有数据划分成若干个数据段,段内数据编号。2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。小明希望他的程序在正确运行样例情况下,运行时间也能尽量小,也就是。,接着将同一段内的数据合并成新数据,其规模等于段内原数据的。,请你求出最优划分方案下,小明的程序的最小运行时间。

团爸讲算法 498

P5665 [CSP-S2019] 划分

只需要在最后用临时高精度变量,

SandwichBK的博客 760

CSP-S 2019 划分

包含CSP-J、CSP-S、CSP-X、NOIP、NOI、GESP、USACO、CCC,真题及模拟题,欢迎订阅💕~

YYX_YYJ的博客 522

信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘 | 洛谷 P5661 [CSP-J2019] 公交换乘

tk[st]的获得时间到当前时间最多45分钟,题中指出“不会有两次乘车记录出现在同一分钟”,因而有效的优惠票不会超过45个,每次遍历有效优惠票的循环次数不会超过45次。因为每次获得优惠票的时间是有序的,因而设置变量st,每次从st开始遍历。相比于每次从头遍历,这样做可以减少对无效票的遍历,降低时间复杂度。设下标st,tk[st]是当前时间下,时间最早的有效的票。当i=st时,tk[i]是有效的票。设置数组tk保存优惠票,优惠票的属性有:获得时间,价格。

君义NOIP的博客 3877

SV fork join_none & for循环结合使用

fork join_none与循环联用常见问题解决方案

ZhangShuHuai11的博客 880

report_delay_calculation/check_timing/report_annotated_parasitics/report_analysis_coverge

如何debug 一颗cell 或一段net 的delay, 常用的办法是用report_delay_calculation 报这颗cell 或这段net, 会得到形式如下的report, 从该report 中可以得到: 表头需要特别关注的是command, 确定report 的对象及加的option; From/To pin: cell 的input pin 和...

diedai7174的博客 1795

2019-CSP-S划分

划分 myymyymyy证明 这道题其他博客已经讲的很清楚了,就是发现这个转移满足单调性然后能满足后面的一定满足前面。 主要讲讲为什么单调队列的转移为什么是q[l+1]q[l+1]q[l+1]而不是q[l]q[l]q[l],由这道题目转移的性质,我们要把这道题决策点的转移尽量卡满(能靠右一定要靠右),那如果满足单调队列里队头决策点的下一个决策点能转移,那么当前队头决策点就一定能被弹掉。如果q[l]q[l]q[l]被弹掉了q[l+1]q[l+1]q[l+1]不一定能满足,那么这道题单调队列转移就会出问题。同时

Young_Zn_Cu 732

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

[2019 CSP-S Day2 T2]划分

如题。应该算是贪心优化DP.

七代目鸽影 981

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1397

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 308

洛谷P5665 [CSP2019]划分

Address 洛谷P5665 Solution 由于没有猜到结论,最后只拿了大众分。 事实上,我们会发现最优解一定满足: 对于每一个断点,最后一段的和在所有合法解中都是最小的。 以下是证明: 显然满足条件的解是唯一的。 构造序列 bbb, 其中 bib_ibi​ 表示满足条件的解中倒数第 iii 段的和,并在序列 bbb 的末尾补上无限个 000。 现在我们需要证明对于任意一个不满...

Log_x's Blog 696

05 - GRACE数据处理-球谐展开与球谐综合

GRACE数据处理-球谐展开和综合前面在介绍GRACE相关理论的时候提到过下面的公式,从公式形式上可以看出,面密度变化和球谐系数(CS)之间是能够相互转换的,那这个转化的过程可以称为球谐展开,简单理解就是将全球网格数据转化为球谐系数的过程。而球谐综合可以看作是球谐展开的逆过程,利用球谐系数计算到全球格网分布。

weixin_43339605的博客 1050

CSP2019&洛谷P5665:划分(单调队列,高精度)

解析 自己写的时候写了二维单调队列优化的64分 一次过还是可以满意了啦 正解的关键结论是最优的方案的最后一段一定尽可能的短 原因嘛…显然 贪心的想,再最后一段的段首可以往前放的情况下肯定是要往前放的,这样代价更小,同时对后面的选取也更加有利 这个性质是可以递归的 考虑如何求以i结尾的最后一段的最短长度 设以iii为末端的最短段的上一段的段尾在posipos_iposi​ 设sis_isi​是[1,i][1,i][1,i]的前缀和 那么posipos_iposi​就是满足: si−sj>=sj−spos

BUG_Creater_jie的博客 315

打开电脑自动弹窗问题:无法为文件‘D:\Config.Msi\*.rbf‘设置文件安全。错误:5。请确认...如何解决?| 提供多种解决方案,亲测有效!

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2909

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 115

[CSP2019] 划分

link 32pts 用 fi,jf_{i,j}fi,j​ 表示最后一段分段为 [i,j][i,j][i,j] 的最小复杂度 O(n3)\mathcal O(n^3)O(n3) 转移即可 64pts 观察发现,显然有当最后一段分段的大小最小的时候答案是最优的,所以记录大小最小的大小以及这个时候的dp值就可以 O(n2)\mathcal O(n^2)O(n2) 转移了。 84pts 我们可以用单调队列维护 2sumi−sumprei2sum_i-sum_{pre_i}2sumi​−sumprei​​ ,就可以

NephrenRuqInsania 726

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

51Nod 1283 最小周长

#include #include #include #include #include #include #include using namespace std; int main(){ int n; scanf("%d",&n); int num=sqrt(n); for(;num<=n;num++){ if(n%num==0){ printf(

JUST CODE IT 252

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

划分

题目 题目描述 2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。这个题的样例有nn组数据,数据从1 \sim n1∼n编号,ii号数据的规模为a_iai​。 小明对该题设计出了一个暴力程序,对于一组规模为uu的数据,该程序的运行时间为u^2u2。然而这个程序运行完一组规模为uu的数据之后,它将在任何一组规模小于uu的数据上运行错误。样例中的...

weixin_43823476的博客 573

Devexpress16.2.6破解工具

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

洛谷 CSP2019-J2 自测 P5661 公交换乘

题目描述 著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案: 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即: t(bus)-t(subway)<=45 搭乘地铁获得的优惠票可以累积,即可以连续搭...

Running Snail 1610

洛谷P1043 数字游戏 | 划分dp入门

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共nn个),你要按顺序将其分为mm个部分,各部分内的数字相加,相加所得的mm个结果对1010取模后再相乘,最终得到一个数kk。游戏的要求是使你所得的k最大或者最小。 例如,对于下面这圈数字(n=4,m=2n=4,m=2): 要求...

一只酷酷光儿的博客 624

[CSP-S 2019 D2T2]划分题解

Preface 这道题简直可以算卡常卡空间比赛了qwq,在线膜拜考场 AC 巨佬 Orz Analysis 这道题和 [CF229D]Towers 可以说除了恶心人的数据几乎一模一样awa 法一:36pts36pts36pts 首先把前缀和数组 sss 求出来。 对于 n≤500n \le 500n≤500,显然直接用 O(N3)O(N^3)O(N3) 的区间 DP 即可。 法二:64pts64pts64pts 要想多骗点分,还需要观察出来一个性质:当最后一段尽量小的时候,答案一定最优。 这个性质虽

qq_62128385的博客 364

洛谷-P5658 [CSP-S 2019] 括号树 题解

本文研究树上路径括号序列问题。给定一棵树,每个节点有一个括号,要求计算从根到每个节点的路径形成的括号串中,不同合法括号子串的数量。通过三次DFS实现:第一次DFS预处理并收集查询;第二次DFS利用线段树统计合法子串数量;第三次DFS累加结果。算法利用前缀和、线段树和离线查询等技术,在O(n log n)时间内高效解决问题。代码实现简洁,通过位运算优化线段树操作,最终输出所有节点答案的异或和。

xiaoniu142857 的博客 655

P5658 [CSP-S2019] 括号树

P5658 [CSP-S2019] 括号树

zzzyyzz_的博客 330

洛谷 P5661 题解

蒟蒻的第四篇题解

Andy_L の 小窝 656
上一篇: 【洛谷P5652】基础博弈练习题【dfs】【博弈论】
下一篇: 【CSP-S 2019】【洛谷P5658】括号树【dfs】【二分】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值