【做题纪要】2月“七月流火降,九月授衣裳” -- 《天星问》

AT_abc250_g [ABC250G] Stonks

一眼过去这不是我们 股票交易 吗,仔细一看好像还真不太一样

容易发现如果用股票交易的方法来 dp 的话复杂度似乎会爆炸,不是很能做,所以考虑用其他方法

考虑贪心,每天对于一个价格,贡献要么为正,要么为负,要么无贡献,设最优的买入当天的价格为 a,最优的卖出当天的价格为 b

我们可以使用小根堆,每次放入一个 \(p_i\),如果说目前的堆顶比当前值小,则在答案累加后将堆顶弹出,并再次加入一个 \(p_i\)

然后就过了

我生分九野 以正四方象观
priority_queue<int,vector<int>,greater<int> > q;
signed main(){
	n=read();
	for_(i,1,n){
		int x=read();
		if(!q.empty()&&q.top()<x) {
			ans+=x-q.top();
			q.pop();
			q.push(x);
		}
		q.push(x);
	}
	writeln(ans);
}

AT_abc252_g [ABC252G] Pre-Order

这啥题,一眼过去没啥思路,但是看到什么方案数什么的还是觉得应该 \(dp\) 一下。

考虑直接区间 \(dp\),用 \(dp_{i,j}\) 表示区间 \([i,j]\) 满足条件的方案数,我们枚举以 \(i\) 为根的情况下子树的点 \(k\)\(dp_{i,j}=(dp_{i,j}+dp_{i+1,k}\times dp_{k,j})\) 个,那么求 \(dp_{1,n}\) 的值即可。

那么就可以 \(O(n^2)\) 解决这个问题。

察宇宙晨昏去复始元
signed main(){
	n = read();
	for_(i,1,n){
		a[i] = read();
	}
	for_(i,1,n){
		dp[i][i] = 1;
	}
	for_(i,2,n){
        for_(j,1,n-i+1){
		    for_(l,j+1,n){
				if( (l==j+i-1) || (a[j+1]<a[l+1]) ){
					(dp[j][j+i-1]+=dp[j+1][l]*dp[l][j+i-1]%P)%=P;
				}
			}
		}
    }
    writeln(dp[1][n]);
}

AT_arc123_f [ARC123F] Insert Addition

邪恶 ARC,似乎是某远古冲刺 NOIP2024 题单的题

考虑用 \(ax+by\) 来代替序列里的数,然后考虑 Stern-Brocot 树内其子树中会出现所有 \(gcd(a,b)=1\)\(ax+by\) 恰好一次。

快速计算子树大小,求有多少 \(ax+by≤n\)\(gcd(a,b)=1\),考虑大力莫反,可以得到一个式子 \(\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{\frac{nx}{d}}\lfloor\frac{\lfloor\frac{n}{d}\rfloor-ix}{y}\rfloor\)

这一步明显直接进行整除分块配合类欧直接 \(O(n \log n)\) 计算了。

而 Stern-Brocot 树上跳相同方向的链时需要倍增跳,链深度是 \(O(\log \max\{a,b\})\)

AT_abc254_g [ABC254G] Elevators

这题居然是紫,一眼看过去以为是板子

首先考虑对于上下楼我们可以统一改为上楼,如果是下楼我们可以直接调转起点和终点的顺序转化为上楼。

我们先不考虑需要转楼层,那么可以发现如果能到达的话就能且只能是 \(w_i-y_i\)

那么我们就可以转化问题为需要走几次天桥,为了方便我们可以把所有能合并的电梯全部合并起来,这对答案是没有影响的而且很显然。

只要切换楼层尽量少就可以了,我们在起点所在楼坐电梯一直上到头 \(y'\),终点所在楼一直下到底 \(w'\),肯定是没啥问题的。

考虑倍增,定义 \(dp_{i,j}\) 表示从第 \(i\) 层出发换乘 \(2^j\) 能到达的最高的楼层,而后用线段树维护即可。

AT_abc257_g [ABC257G] Prefix Concatenation

不认为是 dp,因为如果是 dp 我写不出来。

这题一眼 KMP 喵,然后直接大力贪心,容易发现直接跑 KMP,在跑第 \(i\) 个的时候如果找到了 \(j\) 个相同的字符那么起点就是 \(i-j+1\),此时如果左端点比上一段的终点要大了就只能再开一段了,我们此时给 \(ans+1\) 即可

如果是不成立的情况呢?那就好办了喵,只要判断一下中间会不会找不到 \(j\) 就行了。

AT_abc258_g [ABC258G] Triangle

这题啊,求三元环个数什么的还是比较魔怔,如果暴力使用三元环计数的话复杂度是 \(O(m\sqrt m)\),这题的 \(m\) 会达到 \(n^2\) 级别,导致实际复杂度是 \(O(n^3)\) 所以无法通过

我们枚举 \(i,j\) 的位置,预处理出 \(i,j\) 都能到达的点,枚举后使用 bitset 优化即可。

AT_abc260_g [ABC260G] Scalene Triangle Area

这啥神秘题目,仔细瞅瞅好像也没那么神秘

直接大力暴力,枚举行然后计算连续的一段的左端点和右端点,然后前缀和计算即可,复杂度 \(O(能过)\)

P1344 [USACO4.4] 追查坏牛奶 Pollutant Control

从 shadow 博客翻到的,这题不是最小割板子吗

第一问比较唐,直接求最小割就好了,然后发现第二问改个边权然后再直接求最小割就好了,也挺唐的。

煌煌瞻河汉 晢晢欲浮天南
signed main() {
	int n=read(), m=read();
	add(1, n, 0);
	for_(i,1,m) {
		int x=read(), y=read(), z=read();
		add(x, y, z*(m+1)+1);
	}
	while (bfs(1, n)) 
		maxflow += dinic(1, n, inf);
		
	cout << maxflow / (m+1) << ' ' << maxflow%(m+1) << endl;
}

P1383 高级打字机

从 shadow 博客翻到的,这题不是主席树板子吗

Type 操作就是往序列最后加入一个数,Undo 操作就是退回到第 x 次之前的历史版本,Query 就是朴素的单点查询操作

那这一眼就是主席树板子了啊,直接狠狠可持久化就好了

P6166 [IOI 2012] scrivener

上一题双倍经验,没啥好说的

P5072 [Ynoi Easy Round 2015] 盼君勿忘

看了一圈就觉得这个好像比较可做,那就写这个吧还是

这题感觉比较邪恶,但是发现没有强制在线不带修,这下看懂了,直接使用某莫队算法

具体细节比较板就不说了,但是要注意光速幂不能只处理到 \(\sqrt n\) 不然会 image

P5071 [Ynoi Easy Round 2015] 此时此刻的光辉

这题咋又不是强制在线啊,而且又没修改,而且看起来根号可做,那我直接莫队

直接最暴力的想,我直接分解出每个数的因数个数然后 umap 缩小范围直接跑莫队,但是似乎过不去,有点邪恶

容易发现是因为这道题值域 \(10^9\),但是数还是只有1e5个,那可以把所有数的素因子离散化。

直接大力 PR 计算质因数然后卡常即可

P4593 [TJOI2018] 教科书般的亵渎

有很显然的结论是 \(k\) 的值是 \(m+1\) 张,考虑如何计算分数。

我们可以发现这里的 \(a_i\) (也就是未出现的数值)将整体分割成了至多 \(m+1\) 个区间 \(\{[l_1,r_1],[l_2,r_2],[l_3,r_3]\cdots[l_{m+1},r_{m+1}]\}\),其中我们可以发现 \(l_i\) 实际上是等于 \(a_{i-1}+1\) 的,而 \(r_i\) 实际上是等于 \(a_i-1\) 的,在这里我们认为 \(a_0 = 0\)\(a_{m+1} = n+1\),这样我们就可以完全覆盖所有的区间。

由于使用亵渎的时候是对所有的怪物都进行血量 \(-1\) 的操作,所以当我们已经清除掉了第 \(j\) 个区间内所有的怪物时,实际上第 \(i\) 个区间在此时应该已经转化为了 \([l_i-l_j+1,r_i-r_j+1]\),这个也是很显然的。

设得分为 \(S(n)=\sum\limits_{i=1}^ni^k\),则我们对于任意 $i<j $ 可以得出其贡献为 \(S(l_j-r_i+1)-S(l_j-l_i)\),直接拉格朗日插值法计算即可,轻微卡常。

P6189 [NOI Online #1 入门组] 跑步

看到这题发现可以直接完全背包,然后一个乱搞,诶,你怎么死啦(指只有 70 分),仔细一看,呜呜怎么数据范围是 \(10^5\),我们的 \(O(n^2)\) 算法堂堂趋势了。

那我问你,那我问你,你的算法复杂度怎么尖尖的,考虑优化。我们定义 \(g_{n,k}\) 表示将 \(n\) 拆分成 \(k\) 个正整数的方案数。

那么我们就可以得到一个式子:\(\sum_{i=1}^{n}f_i\sum_{k=1}^{\sqrt n}g(n-1,k)\),可以 \(O(n \sqrt n)\)

P4781 【模板】拉格朗日插值

众所周知给定 \(n+1\) 个横坐标互不相同的点可以唯一确定一个 \(n\) 次多项式,我们如果直接列方程求解复杂度是 \(O(n^3)\) 的,这啥复杂度,所以需要优化。

假设我们现在得到了 \(n+1\) 个点 \((x_1,y_1),(x_2,y_2)\cdots(x_{n+1},y_{n+1})\)

我们设拉格朗日基本多项式为 \(ℓ_j(x) = \prod_{i=0,j\not = i}^{n} \frac{x-x_i}{x_j-x_i}\),这个基本多项式构造十分巧妙,因为注意到 \(ℓ_j(x_j)=1\) ,并且 \(ℓ_j(x_i)=0\),那么,接着构造出这个 \(n\) 次多项式 \(p(x) = \sum_{i=0}^{n}y_iℓ_i(x)\),基本多项式的性质,我们可以知道 \(P(x)=y_i\),也就是经过了这 \(n+1\) 个点。

通过简单的多项式乘法和多项式除法就可以在 \(O(n^2)\) 的时间求出这个多项式的系数表达。

AT_agc002_e [AGC002E] Candy Piles

容易发现这道题是一道博弈论,考虑怎么做,我们可以转化问题,将问题排列到网格图上,这样我们就比较好做了

先将 \(a\) 值排序,然后按照排序完的顺序去铺在网格图上,此时我们可以得到一个连续的图形,第 \(i\) 个矩形的高度为 \(a_i\)

将物品从大到小排序之后不难发现问题转化为了取一个网格图的第一行或者第一列,最终谁会后把物品取完。

直接暴力做即可。

P6271 [湖北省队互测2014] 一个人的数论

题目大意:求 \(\sum\limits_{i=1}^{n} [\gcd(i,n) = i] i^d\)

看到这个总感觉是莫反,仔细看了看,诶,好像还真是,考虑使用传统套路

\[\begin{align}\sum\limits_{i=1}^n [\gcd(i,n) = i] i^d &= \sum_{i=1}^{n}i^d\sum_{k|\gcd(i,n)}\mu(k) \\&=\sum_{k|n}\mu(k) \sum_{i=1}^{\frac{n}k}(xi)^d\\&=\sum_{k|n}\mu(k)k^d\sum_{i=1}^{\frac{n}{k}}i^d\\&=\sum_{k|n}\mu(k)k^d\sum_{i=0}^{d+1}a_i(\frac{n}{k})^d\\&=\sum_{i=0}^{d+1}a_i\sum_{k|n}\mu(k)k^d(\frac{n}{k}^d)\end{align} \]

然后就做完了

AT_agc002_d [AGC002D] Stamp Rally

AT_agc003_d [AGC003D] Anticube

AT_agc003_e [AGC003E] Sequential operations on Sequence

AT_agc004_d [AGC004D] Teleporter

AT_agc004_e [AGC004E] Salvage Robots

AT_agc005_c [AGC005C] Tree Restoring

AT_agc005_e [AGC005E] Sugigma: The Showdown

AT_agc006_c [AGC006C] Rabbit Exercise

P5073 [Ynoi Easy Round 2015] 世上最幸福的女孩

posted @ 2025-02-16 21:33  Vsinger_洛天依  阅读(100)  评论(17)    收藏  举报