<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://wydqwq.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://wydqwq.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-05-30T22:51:25+08:00</updated><id>https://wydqwq.github.io/feed.xml</id><title type="html">HuanLin’s Blog</title><subtitle>Here is HuanLin&apos;s Blog.
</subtitle><author><name>HuanLin</name><email>2011974491@qq.com</email></author><entry><title type="html">题解：P15546 「Stoi2037」七里香</title><link href="https://wydqwq.github.io/2026/03/01/P15546TJ.html" rel="alternate" type="text/html" title="题解：P15546 「Stoi2037」七里香" /><published>2026-03-01T00:00:00+08:00</published><updated>2026-03-01T00:00:00+08:00</updated><id>https://wydqwq.github.io/2026/03/01/P15546TJ</id><content type="html" xml:base="https://wydqwq.github.io/2026/03/01/P15546TJ.html"><![CDATA[<p><a href="https://www.luogu.com.cn/problem/P15546">题面</a></p>

<h2 id="思路">思路</h2>

<h3 id="70-分做法">$70$ 分做法</h3>

<p>$70$ 分需要 $O(n^2)$ 实现，原式中有 $4$ 个变量肯定不能直接套，需要推式子。</p>

\[\sum_{1\le l&lt;r\le n}\sum_{l\le i&lt;j\le r}[((j-1)k+a_j')-((i-1)k+a_i')]\]

<p>发现 $l,r$ 不参与计算，对于一组 $i,j$，当且仅当 $l \in [1,i]$ 且 $r \in [j,n]$ 时会遍历到，因此 $i,j$ 会被遍历 $i \times (n-j+1)$ 次，于是可以将 $\sum_{1\le l&lt;r\le n}\sum_{l\le i&lt;j\le r}$ 转化为 $\sum_{1\le i &lt; j\le n}i(n-j+1)$。</p>

\[\begin{aligned}
&amp; \sum_{1 \leq l&lt;r \leq n} \sum_{l \leq i&lt;j \leq r}\left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right] \\
= &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) \left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right]
\end{aligned}\]

<p>此时只需要枚举 $i,j$，可以 $O(n^2)$ 完成，但是难以看出最大值，继续推。</p>

\[\begin{aligned}
&amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) \left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right] \\
= &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) [(j-i)k+(a_{j}^{\prime}-a_{i}^{\prime})] \\
= &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) (j-i)k+ i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime})
\end{aligned}\]

<p>此时，式子分为常数部分和变量部分，对于左半边，我们可以单独遍历求出。</p>

<p>对于右半部分，发现对于一对 $i,j$，$a_j^{\prime}$ 的权重为 $i(n-j+1)$，$a_i^{\prime}$ 的权重为 $-i(n-j+1)$。</p>

<p>因此，我们可以在遍历时计算各位置的权重并排序，与排序过后的 $a$ 数组一一对应相乘，并且加上常数部分，即可得出答案。</p>

<p>计算过程中可能出现范围超过 long long 的情况，可以用 int128 解决。</p>

<p>这个做法理论上是 $70$ 分，但是交上去似乎有 $80$ 分。</p>

<h3 id="100-分做法">$100$ 分做法</h3>

<p>依旧继续推式子。</p>

<p>对于常数部分，因为和 $k$ 没关系，所以先把 $k$ 提出。</p>

\[\begin{aligned}
&amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) [(j-i)k+(a_{j}^{\prime}-a_{i}^{\prime})] \\
= &amp; k \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(j-i)
\end{aligned}\]

<p>固定 $i$ 不变，对 $j$ 求和。令 $d=j-i$，则 $j=i+d$，$d \in [1,n-i]$，令 $m=n-i$。</p>

<p>将其代入算出 $i$ 的求和项。</p>

\[\begin{aligned}
&amp; k \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(j-i) \\
= &amp; k \sum_{j=i+1}^n i(n-j+1)(j-i) \\
= &amp; k \sum_{d=1}^m i[n-(i+d)+1] \times d \\
= &amp; k \sum_{d=1}^m i[(n-i+1)-d] \times d \\
= &amp; k \sum_{d=1}^m i[(n-i+1)d-d^2] \\
= &amp; k (\sum_{d=1}^m i + \sum_{d=1}^m [(n-i+1)d-d^2]) \\
= &amp; k (\sum_{d=1}^m i + \sum_{d=1}^m (n-i+1)d- \sum_{d=1}^m d^2) \\
\end{aligned}\]

<p>其中 $\sum_{d=1}^m i$ 可以单独算出，右半部分考虑运用等差数列求和公式以及平方和公式。</p>

\[\begin{aligned}
&amp; \sum_{d=1}^m d=\frac{m(m+1)}{2} \\
&amp; \sum_{d=1}^m d^2=\frac{m(m+1)(2m+1)}{6}
\end{aligned}\]

<p>代入原式。</p>

\[\begin{aligned}
&amp; k (\sum_{d=1}^m i + \sum_{d=1}^m (n-i+1)d- \sum_{d=1}^m d^2) \\
= &amp; k (\sum_{d=1}^m i + (n-i+1)\times \frac{m(m+1)}{2}-\frac{m(m+1)(2m+1)}{6})
\end{aligned}\]

<p>至此，常数部分推导完毕，接下来看变量部分。</p>

\[\sum_{1 \leq i&lt;j \leq n} i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime})\]

<p>从 $70$ 分的做法来说，我们的目标是求出对于 $1\le i \le n$ 中 $i$ 的权重。设 $i$ 的权重为 $w_i$，则我们的目标应该是求出以下式子。($i$ 和原式重复，所以这里使用 $p$)</p>

\[\sum_{p=1}^n w_p \times a_p\]

<p>首先，将原式的 $a_j^{\prime}$ 和 $a_i^{\prime}$ 分开。</p>

\[\begin{aligned}
&amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime}) \\
= &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)a_{j}^{\prime}- \sum_{1\le i &lt; j\le n} i(n-j+1)a_{i}^{\prime}
\end{aligned}\]

<p>此时分 $2$ 种情况。</p>

<p>第 $1$ 种，$p=j$，此时 $i \in [1,p-1]$。</p>

\[\begin{aligned}
&amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)a_{j}^{\prime} \\
= &amp; \sum_{i=1}^{p-1} i(n-p+1)a_{p}^{\prime} \\
= &amp; (n-p+1) \sum_{i=1}^{p-1} i\ a_{p}^{\prime} \\
= &amp; (n-p+1) \times \frac{p(p-1)}{2} \sum_{i=1}^{p-1} \ a_{p}^{\prime}
\end{aligned}\]

<p>即 $w_p=(n-p+1)\times \frac{p(p-1)}{2}$.</p>

<p>第二种，$p=i$，此时 $j \in [p+1,n]$。</p>

\[\begin{aligned}
&amp; -\sum_{1\le i &lt; j\le n} i(n-j+1)a_{i}^{\prime} \\
= &amp; -\sum_{j=p+1}^n p(n-j+1)a_{p}^{\prime} \\
= &amp; -p \sum_{j=p+1}^n (n-j+1)a_{p}^{\prime} \\
\end{aligned}\]

<p>令 $t=j-p$，则 $t \in [1,n-p]$，设 $m=n-p$。</p>

\[\begin{aligned}
&amp; -p \sum_{j=p+1}^n (n-j+1)a_{p}^{\prime} \\
= &amp; -p \sum_{t=1}^{m} (n-j+1)a_{p}^{\prime} \\
= &amp; -p \sum_{t=1}^{m} (n-j+p-p+1)a_{p}^{\prime} \\
= &amp; -p \sum_{t=1}^{m} (n-p+1-t)a_{p}^{\prime} \\
= &amp; -p [\sum_{t=1}^{m} (n-p+1)-\sum_{t=1}^m t ]\sum_{j=p+1}^n a_{p}^{\prime} \\
= &amp; -p [m(m+1)-\frac{m(m+1)}{2}]\sum_{j=p+1}^n a_{p}^{\prime} \\
= &amp; -p \times \frac{m(m+1)}{2}\sum_{j=p+1}^n a_{p}^{\prime} \\
\end{aligned}\]

<p>因此，$w_p= -p \times \frac{(n-p)(n-p+1)}{2}$。</p>

<p>将两种情况相加可得，$w_p=(n-p+1)\times \frac{p(p-1)}{2}-p \times \frac{(n-p)(n-p+1)}{2}$</p>

<p>经过化简可得，$w_p=\frac{p(n−p+1)(2p−n−1)}{2}$。</p>

<p>然后就和 $70$ 分的操作一样，将权重排序后与排序过的 $a$ 一一对应相乘，最后加上常数项，即为答案。</p>

<p>计算过程中可能出现范围超过 long long 的情况，可以用 int128 解决。</p>
<h2 id="代码">代码</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>70分
#include&lt;bits/stdc++.h&gt;
using namespace std;
#define int __int128
const int N=1e6+10,LG=30;
int n,k;
int a[N],w[N];
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch&lt;'0'||ch&gt;'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch&gt;='0' &amp;&amp; ch&lt;='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void write(int x){
	if(x&lt;0)
		putchar('-'),x=-x;
	if(x&gt;9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	n=read();k=read();
	for(int i=1;i&lt;=n;i++){
		a[i]=read();
	}
	sort(a+1,a+n+1);
	for(int i=1;i&lt;=n;i++){
		for(int j=i+1;j&lt;=n;j++){
			int cnt=i*(n-j+1);
			w[i]-=cnt;
			w[j]+=cnt;
		}
	}
	sort(w+1,w+n+1);
	int ans=0;
	for(int i=1;i&lt;=n;i++){
		for(int j=i+1;j&lt;=n;j++){
			ans+=i*k*(n-j+1)*(j-i);
		}
	}
	for(int i=1;i&lt;=n;i++){
		ans+=w[i]*a[i];
	}
	write(ans);
	return 0;
}
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>100分
#include&lt;bits/stdc++.h&gt;
using namespace std;
#define int __int128
const int N=2e6+10;
int n,k;
int a[N],w[N];
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch&lt;'0'||ch&gt;'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch&gt;='0' &amp;&amp; ch&lt;='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void write(int x){
	if(x&lt;0)
		putchar('-'),x=-x;
	if(x&gt;9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	n=read();k=read();
	for(int i=1;i&lt;=n;i++){
		a[i]=read();
	}
	sort(a+1,a+n+1);
	for(int i=1;i&lt;=n;i++){
		int m=n-i+1;
		w[i]=i*m*(2*i-n-1)/2;
	}
	sort(w+1,w+n+1);
	int ans=0;
	for(int i=1;i&lt;=n;i++){
		int m=n-i;
		int sum=(n-i+1)*m*(m+1)/2-m*(m+1)*(2*m+1)/6;
		ans+=i*sum;
	}
	ans*=k;
	for(int i=1;i&lt;=n;i++){
		ans+=w[i]*a[i];
	}
	write(ans);
	return 0;
}
</code></pre></div></div>]]></content><author><name>HuanLin</name><email>2011974491@qq.com</email></author><category term="OI" /><category term="题解" /><summary type="html"><![CDATA[题面 思路 $70$ 分做法 $70$ 分需要 $O(n^2)$ 实现，原式中有 $4$ 个变量肯定不能直接套，需要推式子。 \[\sum_{1\le l&lt;r\le n}\sum_{l\le i&lt;j\le r}[((j-1)k+a_j')-((i-1)k+a_i')]\] 发现 $l,r$ 不参与计算，对于一组 $i,j$，当且仅当 $l \in [1,i]$ 且 $r \in [j,n]$ 时会遍历到，因此 $i,j$ 会被遍历 $i \times (n-j+1)$ 次，于是可以将 $\sum_{1\le l&lt;r\le n}\sum_{l\le i&lt;j\le r}$ 转化为 $\sum_{1\le i &lt; j\le n}i(n-j+1)$。 \[\begin{aligned} &amp; \sum_{1 \leq l&lt;r \leq n} \sum_{l \leq i&lt;j \leq r}\left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right] \\ = &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) \left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right] \end{aligned}\] 此时只需要枚举 $i,j$，可以 $O(n^2)$ 完成，但是难以看出最大值，继续推。 \[\begin{aligned} &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) \left[\left((j-1) k+a_{j}^{\prime}\right)-\left((i-1) k+a_{i}^{\prime}\right)\right] \\ = &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) [(j-i)k+(a_{j}^{\prime}-a_{i}^{\prime})] \\ = &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) (j-i)k+ i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime}) \end{aligned}\] 此时，式子分为常数部分和变量部分，对于左半边，我们可以单独遍历求出。 对于右半部分，发现对于一对 $i,j$，$a_j^{\prime}$ 的权重为 $i(n-j+1)$，$a_i^{\prime}$ 的权重为 $-i(n-j+1)$。 因此，我们可以在遍历时计算各位置的权重并排序，与排序过后的 $a$ 数组一一对应相乘，并且加上常数部分，即可得出答案。 计算过程中可能出现范围超过 long long 的情况，可以用 int128 解决。 这个做法理论上是 $70$ 分，但是交上去似乎有 $80$ 分。 $100$ 分做法 依旧继续推式子。 对于常数部分，因为和 $k$ 没关系，所以先把 $k$ 提出。 \[\begin{aligned} &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1) [(j-i)k+(a_{j}^{\prime}-a_{i}^{\prime})] \\ = &amp; k \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(j-i) \end{aligned}\] 固定 $i$ 不变，对 $j$ 求和。令 $d=j-i$，则 $j=i+d$，$d \in [1,n-i]$，令 $m=n-i$。 将其代入算出 $i$ 的求和项。 \[\begin{aligned} &amp; k \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(j-i) \\ = &amp; k \sum_{j=i+1}^n i(n-j+1)(j-i) \\ = &amp; k \sum_{d=1}^m i[n-(i+d)+1] \times d \\ = &amp; k \sum_{d=1}^m i[(n-i+1)-d] \times d \\ = &amp; k \sum_{d=1}^m i[(n-i+1)d-d^2] \\ = &amp; k (\sum_{d=1}^m i + \sum_{d=1}^m [(n-i+1)d-d^2]) \\ = &amp; k (\sum_{d=1}^m i + \sum_{d=1}^m (n-i+1)d- \sum_{d=1}^m d^2) \\ \end{aligned}\] 其中 $\sum_{d=1}^m i$ 可以单独算出，右半部分考虑运用等差数列求和公式以及平方和公式。 \[\begin{aligned} &amp; \sum_{d=1}^m d=\frac{m(m+1)}{2} \\ &amp; \sum_{d=1}^m d^2=\frac{m(m+1)(2m+1)}{6} \end{aligned}\] 代入原式。 \[\begin{aligned} &amp; k (\sum_{d=1}^m i + \sum_{d=1}^m (n-i+1)d- \sum_{d=1}^m d^2) \\ = &amp; k (\sum_{d=1}^m i + (n-i+1)\times \frac{m(m+1)}{2}-\frac{m(m+1)(2m+1)}{6}) \end{aligned}\] 至此，常数部分推导完毕，接下来看变量部分。 \[\sum_{1 \leq i&lt;j \leq n} i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime})\] 从 $70$ 分的做法来说，我们的目标是求出对于 $1\le i \le n$ 中 $i$ 的权重。设 $i$ 的权重为 $w_i$，则我们的目标应该是求出以下式子。($i$ 和原式重复，所以这里使用 $p$) \[\sum_{p=1}^n w_p \times a_p\] 首先，将原式的 $a_j^{\prime}$ 和 $a_i^{\prime}$ 分开。 \[\begin{aligned} &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)(a_{j}^{\prime}-a_{i}^{\prime}) \\ = &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)a_{j}^{\prime}- \sum_{1\le i &lt; j\le n} i(n-j+1)a_{i}^{\prime} \end{aligned}\] 此时分 $2$ 种情况。 第 $1$ 种，$p=j$，此时 $i \in [1,p-1]$。 \[\begin{aligned} &amp; \sum_{1 \leq i&lt;j \leq n} i(n-j+1)a_{j}^{\prime} \\ = &amp; \sum_{i=1}^{p-1} i(n-p+1)a_{p}^{\prime} \\ = &amp; (n-p+1) \sum_{i=1}^{p-1} i\ a_{p}^{\prime} \\ = &amp; (n-p+1) \times \frac{p(p-1)}{2} \sum_{i=1}^{p-1} \ a_{p}^{\prime} \end{aligned}\] 即 $w_p=(n-p+1)\times \frac{p(p-1)}{2}$. 第二种，$p=i$，此时 $j \in [p+1,n]$。 \[\begin{aligned} &amp; -\sum_{1\le i &lt; j\le n} i(n-j+1)a_{i}^{\prime} \\ = &amp; -\sum_{j=p+1}^n p(n-j+1)a_{p}^{\prime} \\ = &amp; -p \sum_{j=p+1}^n (n-j+1)a_{p}^{\prime} \\ \end{aligned}\] 令 $t=j-p$，则 $t \in [1,n-p]$，设 $m=n-p$。 \[\begin{aligned} &amp; -p \sum_{j=p+1}^n (n-j+1)a_{p}^{\prime} \\ = &amp; -p \sum_{t=1}^{m} (n-j+1)a_{p}^{\prime} \\ = &amp; -p \sum_{t=1}^{m} (n-j+p-p+1)a_{p}^{\prime} \\ = &amp; -p \sum_{t=1}^{m} (n-p+1-t)a_{p}^{\prime} \\ = &amp; -p [\sum_{t=1}^{m} (n-p+1)-\sum_{t=1}^m t ]\sum_{j=p+1}^n a_{p}^{\prime} \\ = &amp; -p [m(m+1)-\frac{m(m+1)}{2}]\sum_{j=p+1}^n a_{p}^{\prime} \\ = &amp; -p \times \frac{m(m+1)}{2}\sum_{j=p+1}^n a_{p}^{\prime} \\ \end{aligned}\] 因此，$w_p= -p \times \frac{(n-p)(n-p+1)}{2}$。 将两种情况相加可得，$w_p=(n-p+1)\times \frac{p(p-1)}{2}-p \times \frac{(n-p)(n-p+1)}{2}$ 经过化简可得，$w_p=\frac{p(n−p+1)(2p−n−1)}{2}$。 然后就和 $70$ 分的操作一样，将权重排序后与排序过的 $a$ 一一对应相乘，最后加上常数项，即为答案。 计算过程中可能出现范围超过 long long 的情况，可以用 int128 解决。 代码 70分 #include&lt;bits/stdc++.h&gt; using namespace std; #define int __int128 const int N=1e6+10,LG=30; int n,k; int a[N],w[N]; int read(){ int x=0,f=1; char ch=getchar(); while(ch&lt;'0'||ch&gt;'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch&gt;='0' &amp;&amp; ch&lt;='9') x=x*10+ch-'0',ch=getchar(); return x*f; } void write(int x){ if(x&lt;0) putchar('-'),x=-x; if(x&gt;9) write(x/10); putchar(x%10+'0'); return; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); n=read();k=read(); for(int i=1;i&lt;=n;i++){ a[i]=read(); } sort(a+1,a+n+1); for(int i=1;i&lt;=n;i++){ for(int j=i+1;j&lt;=n;j++){ int cnt=i*(n-j+1); w[i]-=cnt; w[j]+=cnt; } } sort(w+1,w+n+1); int ans=0; for(int i=1;i&lt;=n;i++){ for(int j=i+1;j&lt;=n;j++){ ans+=i*k*(n-j+1)*(j-i); } } for(int i=1;i&lt;=n;i++){ ans+=w[i]*a[i]; } write(ans); return 0; } 100分 #include&lt;bits/stdc++.h&gt; using namespace std; #define int __int128 const int N=2e6+10; int n,k; int a[N],w[N]; int read(){ int x=0,f=1; char ch=getchar(); while(ch&lt;'0'||ch&gt;'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch&gt;='0' &amp;&amp; ch&lt;='9') x=x*10+ch-'0',ch=getchar(); return x*f; } void write(int x){ if(x&lt;0) putchar('-'),x=-x; if(x&gt;9) write(x/10); putchar(x%10+'0'); return; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); n=read();k=read(); for(int i=1;i&lt;=n;i++){ a[i]=read(); } sort(a+1,a+n+1); for(int i=1;i&lt;=n;i++){ int m=n-i+1; w[i]=i*m*(2*i-n-1)/2; } sort(w+1,w+n+1); int ans=0; for(int i=1;i&lt;=n;i++){ int m=n-i; int sum=(n-i+1)*m*(m+1)/2-m*(m+1)*(2*m+1)/6; ans+=i*sum; } ans*=k; for(int i=1;i&lt;=n;i++){ ans+=w[i]*a[i]; } write(ans); return 0; }]]></summary></entry><entry><title type="html">NOIP 2025游记</title><link href="https://wydqwq.github.io/2025/11/28/NOIP2025.html" rel="alternate" type="text/html" title="NOIP 2025游记" /><published>2025-11-28T00:00:00+08:00</published><updated>2025-11-28T00:00:00+08:00</updated><id>https://wydqwq.github.io/2025/11/28/NOIP2025</id><content type="html" xml:base="https://wydqwq.github.io/2025/11/28/NOIP2025.html"><![CDATA[<h2 id="day0">Day0</h2>

<p>押了一手 tarjan 缩点，然后回去看以前老师讲的课件了，发现之前很多不会的题现在看一眼就能想出做法（主要还是太板了）。</p>

<p>在车上听了好久的歌，堵车堵了 2h 才到酒店。</p>

<p>啥啊，调了 2h 还从 90pts -&gt; 75pts 了，不想玩了，睡觉。</p>

<h2 id="day1">Day1</h2>

<p>凌晨3点不知道为什么醒了，然后躺了 2h 睡不着，刷视频到早上。</p>

<p>在考场见到 @dg114514 大佬了，希望能沾沾喜气。</p>

<p>不是为什么这个考场喝水都要打报告，我是社恐，所以只能渴 4.5h 了。</p>

<p>开题。T1 感觉像是贪心就直接先对 $x_i+y_i$ 排序，然后能买多少就买多少，最后对所有的 $x_i$ 的排序，易证尽量买以上糖果后最多只能买其他各种糖果的第一次的价格，所以排序一遍从小的开始买。</p>

<p>然后发现假了，因为你不知道某一时刻买一次 $x_1+y_1$ 好，还是尽量买从小开始的 $x_i$ 好，尝试反悔一次，但还是失败了，调了好久想要人类智慧，失败。</p>

<p>想了 2h 想到了可以倒过来实现，从大到小枚举 $x_i$，设这种情况是买了前 $i$ 个糖果的 $x_i$，然后用剩下的值尽量买 $x_1+y_1$ 就是答案，$i=0$ 时即为全买 $x_1+y_1$ 的情况。注意此处 $x_1+y_1$ 并不是从大到小枚举 $x_i$ 的顺序，详情看前文。</p>

<p>嗯，然后就写完了 T1，然后就如其他人一样，我看着后三道题目，脑子空空，甚至想不出暴力。</p>

<p>我尽力写了 T2 的暴力，然后没调出来，发现 $m=2n-1$ 和 $a_1=a_2=…=a_n$ 的性质都是全部方案都可行（民间数据看起来是对的），就写了上去。</p>

<p>其实试着打了 T4 暴力，然后没打出来开摆了。</p>

<p>第一眼看到 T3 时很熟悉，想起了 miya 姐姐出的那道题本来也是有一个 $mex(S)$ 的，不过她说 std 写炸了。</p>

<p>嗯，就是这样，初中的 OI 生涯就这样草草结尾了。</p>

<p>总结：$100+[8,28]+0+0=[108,128]$。</p>

<h2 id="后话">后话</h2>

<p>说实话，出考场后看到三道紫我确实没想到，因为我一直认为我是个很菜的人，我以为 T2 是蓝呢，都感觉自己高中 OI 生涯要完蛋了。</p>

<p>也好，沉入过低谷，也就只能向上爬了。</p>]]></content><author><name>HuanLin</name><email>2011974491@qq.com</email></author><category term="OI" /><category term="游记" /><summary type="html"><![CDATA[Day0 押了一手 tarjan 缩点，然后回去看以前老师讲的课件了，发现之前很多不会的题现在看一眼就能想出做法（主要还是太板了）。 在车上听了好久的歌，堵车堵了 2h 才到酒店。 啥啊，调了 2h 还从 90pts -&gt; 75pts 了，不想玩了，睡觉。 Day1 凌晨3点不知道为什么醒了，然后躺了 2h 睡不着，刷视频到早上。 在考场见到 @dg114514 大佬了，希望能沾沾喜气。 不是为什么这个考场喝水都要打报告，我是社恐，所以只能渴 4.5h 了。 开题。T1 感觉像是贪心就直接先对 $x_i+y_i$ 排序，然后能买多少就买多少，最后对所有的 $x_i$ 的排序，易证尽量买以上糖果后最多只能买其他各种糖果的第一次的价格，所以排序一遍从小的开始买。 然后发现假了，因为你不知道某一时刻买一次 $x_1+y_1$ 好，还是尽量买从小开始的 $x_i$ 好，尝试反悔一次，但还是失败了，调了好久想要人类智慧，失败。 想了 2h 想到了可以倒过来实现，从大到小枚举 $x_i$，设这种情况是买了前 $i$ 个糖果的 $x_i$，然后用剩下的值尽量买 $x_1+y_1$ 就是答案，$i=0$ 时即为全买 $x_1+y_1$ 的情况。注意此处 $x_1+y_1$ 并不是从大到小枚举 $x_i$ 的顺序，详情看前文。 嗯，然后就写完了 T1，然后就如其他人一样，我看着后三道题目，脑子空空，甚至想不出暴力。 我尽力写了 T2 的暴力，然后没调出来，发现 $m=2n-1$ 和 $a_1=a_2=…=a_n$ 的性质都是全部方案都可行（民间数据看起来是对的），就写了上去。 其实试着打了 T4 暴力，然后没打出来开摆了。 第一眼看到 T3 时很熟悉，想起了 miya 姐姐出的那道题本来也是有一个 $mex(S)$ 的，不过她说 std 写炸了。 嗯，就是这样，初中的 OI 生涯就这样草草结尾了。 总结：$100+[8,28]+0+0=[108,128]$。 后话 说实话，出考场后看到三道紫我确实没想到，因为我一直认为我是个很菜的人，我以为 T2 是蓝呢，都感觉自己高中 OI 生涯要完蛋了。 也好，沉入过低谷，也就只能向上爬了。]]></summary></entry><entry><title type="html">CSP-J/S 2025游记</title><link href="https://wydqwq.github.io/2025/11/02/CSP2025.html" rel="alternate" type="text/html" title="CSP-J/S 2025游记" /><published>2025-11-02T00:00:00+08:00</published><updated>2025-11-02T00:00:00+08:00</updated><id>https://wydqwq.github.io/2025/11/02/CSP2025</id><content type="html" xml:base="https://wydqwq.github.io/2025/11/02/CSP2025.html"><![CDATA[<p>有可能是最后一次了，很难想象这其实是我的第一次 CSP 复赛。</p>

<p>考前还在写莫队笔记，颓麻了。</p>

<p>膜你赛最高只有135，如何一等。</p>

<h2 id="day0">Day0</h2>

<p>8点要去酒店住一晚，深外离家太远了。</p>

<p>比我小一届的学弟还在群里和我诉苦说怕爆零，其实我比他更怕，因为上四大的机会只有这一次。</p>

<p>还没出发，玩会游戏。</p>

<h2 id="day1">Day1</h2>

<h3 id="凌晨">凌晨</h3>

<p>生物钟打败了电子闹钟。</p>

<p>起来看了眼电脑，发现博客阅读数居然破 400 了，比较逆天。</p>

<h2 id="csp-j">CSP-J</h2>

<p>T1 简单的过分，5min 切掉。</p>

<p>T2 也一样，10min 切掉。</p>

<p>T3 不会，但是容易知道能选的区间肯定越小越好，所以预处理异或前缀和后 $O(n^2)$ 枚举每个点作为 $l$ 能取到的最小区间，然后 DP。我也不知道我为什么要注意到 DP 有单调性然后手动写个二分转移，闲的吧。</p>

<p>其实看出正解是枚举位数了，但是作者的位运算跟区没什么区别，反正 T3 是先写了 60pts。</p>

<p>然后去看 T4，不会，写爆搜。</p>

<p>嗯。发了会呆觉得纯正搜索还是太暴力了，于是试图转化。容易发现可以把全部情况减去错误答案来求得最后答案，于是可以枚举一群棍木的最大值，然后在小于这个值的范围里搜索，还能剪枝，太好了。于是你就从 $O(2^n)$ 的非常不好复杂度转化为了 $O(n2^n)$ 的非常棒的复杂度，看了眼性质，发现这个 $a_i \le 1$ 的性质很好写，只需要求 $\sum^{n}_{i=3}C^n_i$ 就行了。作者不会记上下顺序，所以可能写反了。</p>

<p>然后 T4 就得到了 64pts。</p>

<p>回去看 T3，发现 $a_i \le 1$ 的性质很好写<del>怎么又是你</del>，只需要根据 $k$ 分类讨论就行了，然后 T3 就是 65pts 了。</p>

<p>期望 $100+100+65+64=329$。</p>

<h3 id="中午">中午</h3>

<p>ZJY 说他昨晚没睡好，困死了没打好，有点惨。</p>

<p>麦当当吃了好久没吃过的巨无霸。</p>

<h3 id="csp-s">CSP-S</h3>

<p>深圳外国语开考前 15min 才让进楼，何意味。</p>

<p>进场，第一看 T1 就知道肯定是贪心，然后写了个最大 - 最小的贪心，然后大样例没过，就去看 T2 了。</p>

<p>1h 了，T2 也没看出来，又回去 T1。</p>

<p>于是就发现了这个逆天错误，替换的明明是次大值为什么要拿最小值贪心，改成最大  次大，过了。</p>

<p>已经过了 1.5h。</p>

<p>去看 T3，看不懂太难了，然后去看 T4。</p>

<p>T4 感觉能写 A 性质，然后写完发现假了，就写了个搜索回去 T2。</p>

<p>发现 T2 的 A 性质直接加边就行了，写了，然后调了很久，但是还是调完了。</p>

<p>想攻 T3 搜索，写了很久，写完后感觉复杂度太大了，估计拿不到分，就改成全输出 $0$ 摆烂了。</p>

<p>最后一段时间发现 T2 空间可能爆了，把边数组改成了 $10^7$，不知道能不能卡过。</p>

<p>期望 $100+[16,40]+0+8=[124,148]$，应该只有二等了。</p>

<hr />

<p>J：100+35+70+64=269</p>

<p>为什么他妈T2能挂65pts。</p>

<p>S：100+40+0+8=148</p>

<p>还好S组没挂。</p>

<hr />

<p>行啊广东，J组差1分，S组差4分，跳了。</p>]]></content><author><name>HuanLin</name><email>2011974491@qq.com</email></author><category term="OI" /><category term="游记" /><summary type="html"><![CDATA[有可能是最后一次了，很难想象这其实是我的第一次 CSP 复赛。 考前还在写莫队笔记，颓麻了。 膜你赛最高只有135，如何一等。 Day0 8点要去酒店住一晚，深外离家太远了。 比我小一届的学弟还在群里和我诉苦说怕爆零，其实我比他更怕，因为上四大的机会只有这一次。 还没出发，玩会游戏。 Day1 凌晨 生物钟打败了电子闹钟。 起来看了眼电脑，发现博客阅读数居然破 400 了，比较逆天。 CSP-J T1 简单的过分，5min 切掉。 T2 也一样，10min 切掉。 T3 不会，但是容易知道能选的区间肯定越小越好，所以预处理异或前缀和后 $O(n^2)$ 枚举每个点作为 $l$ 能取到的最小区间，然后 DP。我也不知道我为什么要注意到 DP 有单调性然后手动写个二分转移，闲的吧。 其实看出正解是枚举位数了，但是作者的位运算跟区没什么区别，反正 T3 是先写了 60pts。 然后去看 T4，不会，写爆搜。 嗯。发了会呆觉得纯正搜索还是太暴力了，于是试图转化。容易发现可以把全部情况减去错误答案来求得最后答案，于是可以枚举一群棍木的最大值，然后在小于这个值的范围里搜索，还能剪枝，太好了。于是你就从 $O(2^n)$ 的非常不好复杂度转化为了 $O(n2^n)$ 的非常棒的复杂度，看了眼性质，发现这个 $a_i \le 1$ 的性质很好写，只需要求 $\sum^{n}_{i=3}C^n_i$ 就行了。作者不会记上下顺序，所以可能写反了。 然后 T4 就得到了 64pts。 回去看 T3，发现 $a_i \le 1$ 的性质很好写怎么又是你，只需要根据 $k$ 分类讨论就行了，然后 T3 就是 65pts 了。 期望 $100+100+65+64=329$。 中午 ZJY 说他昨晚没睡好，困死了没打好，有点惨。 麦当当吃了好久没吃过的巨无霸。 CSP-S 深圳外国语开考前 15min 才让进楼，何意味。 进场，第一看 T1 就知道肯定是贪心，然后写了个最大 - 最小的贪心，然后大样例没过，就去看 T2 了。 1h 了，T2 也没看出来，又回去 T1。 于是就发现了这个逆天错误，替换的明明是次大值为什么要拿最小值贪心，改成最大 次大，过了。 已经过了 1.5h。 去看 T3，看不懂太难了，然后去看 T4。 T4 感觉能写 A 性质，然后写完发现假了，就写了个搜索回去 T2。 发现 T2 的 A 性质直接加边就行了，写了，然后调了很久，但是还是调完了。 想攻 T3 搜索，写了很久，写完后感觉复杂度太大了，估计拿不到分，就改成全输出 $0$ 摆烂了。 最后一段时间发现 T2 空间可能爆了，把边数组改成了 $10^7$，不知道能不能卡过。 期望 $100+[16,40]+0+8=[124,148]$，应该只有二等了。 J：100+35+70+64=269 为什么他妈T2能挂65pts。 S：100+40+0+8=148 还好S组没挂。 行啊广东，J组差1分，S组差4分，跳了。]]></summary></entry></feed>