THUPC 2026 初赛补题

第一次参加 THUPC,获得了 rk600 的成绩,你也来试试吧。当然查重后可能就不是 rk600 了。

场上过了 LM。


A

B

C

D

E

F

G

H

I

J

K

L. 宝石分组

这部分的内容我不会证明,所以采取了举例子的手段。

一组宝石的美观值,定义为这组宝石亮度平均值的平方。从定义出发,我们可以得到以下结论;

分成的组数越多,整体美观值越大。

不妨考虑有 \(S\)\(T\) 两组宝石,其合并后的平均值必然介于两组的平均值之间。由此我们知道此时 \(S+T\)\(S\)\(T\) 中的其中一个美观值要小。

接下来得到下面结论:

将宝石按亮度排序,每组宝石必然是连续的一段。

考虑 \(b_1 \leq b_2 \leq b_3 \leq b_4\),不妨考虑以下三种方式:

  • \((b_1,b_2)\)\((b_3,b_4)\),此时美观值为 \((\dfrac{b_1+b_2}{2})^2+(\dfrac{b_3+b_4}{2})^2=\dfrac{b_1^2+b_2^2+b_3^2+b_4^2+2b_1b_2+2b_3b_4}{4}\)

  • \((b_1,b_3)\)\((b_2,b_4)\),此时美观值为 \((\dfrac{b_1+b_3}{2})^2+(\dfrac{b_2+b_4}{2})^2=\dfrac{b_1^2+b_2^2+b_3^2+b_4^2+2b_1b_3+2b_2b_4}{4}\)

  • \((b_1,b_4)\)\((b_2,b_3)\),此时美观值为 \((\dfrac{b_1+b_4}{2})^2+(\dfrac{b_2+b_3}{2})^2=\dfrac{b_1^2+b_2^2+b_3^2+b_4^2+2b_1b_4+2b_2b_3}{4}\)

接下来你只需要比较 \(b_1b_2+b_3b_4\)\(b_1b_3+b_2b_4\)\(b_1b_4+b_2b_3\) 的大小即可。考虑作差,\((b_1b_2+b_3b_4)-(b_1b_3+b_2b_4)=(b_1-b_4)(b_2-b_3) \geq 0\)\((b_1b_3+b_2b_4)-(b_1b_4+b_2b_3)=(b_1-b_2)(b_3-b_4) \geq 0\)。由此你发现,取相邻的更优。

接下来得到下面结论:

将宝石按亮度从小到大排序,越靠前的组分的越多。

考虑 \(b_1 \leq b_2 \leq b_3 \leq b_4\),不妨考虑以下三种方式:

  • \((b_1,b_2,b_3)\)\((b_4)\),此时美观值为 \((\dfrac{b_1+b_2+b_3}{3})^2+b_4^2\)

  • \((b_1,b_2)\)\((b_3,b_4)\),此时美观值为 \((\dfrac{b_1+b_2}{2})^2+(\dfrac{b_3+b_4}{2})^2\)

  • \((b_1)\)\((b_2,b_3,b_4)\),此时美观值为 \(b_1^2+(\dfrac{b_2+b_3+b_4}{3})^2\)

不想推了,反正你随便带几个值比如 \(0 \leq 2 \leq 4 \leq 6\),第一种美观值是 \(40\),第二种是 \(26\),第三种是 \(16\)。你发现第一种最优。

所以现在你的分组方式就是 \([r,r,\dots,r,x,l,l,\dots,l]\),预处理前缀和后缀的和即可。

因为是调和级数的,复杂度是 \(O(n \log n)\)

场上过完这题之后就罚坐了。

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const long long mod=1000000007;
long long a[500010],sum[500010];
vector<long long> suml[500010],sumr[500010];
long long inv(long long num){
	long long pre=mod-2,ans=1;
	while(pre){
		if(pre&1){
			ans=ans*num%mod;
		}
		num=num*num%mod;
		pre>>=1;
	}
	return ans;
}
int main(){
	int n,q;
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+a[i];
		sum[i]%=mod;
	}
	for(int i=1;i<=n;i++){
		long long pre_sum=0,inv_num=inv(i);
		suml[i].push_back(pre_sum);
		for(int j=1;j<=n/i;j++){
			pre_sum+=(sum[j*i]-sum[(j-1)*i])*(sum[j*i]-sum[(j-1)*i])%mod*inv_num%mod*inv_num%mod;
			pre_sum%=mod;
			suml[i].push_back(pre_sum);
		}
	}
	for(int i=1;i<=n;i++){
		long long pre_sum=0,inv_num=inv(i);
		sumr[i].push_back(pre_sum);
		for(int j=1;j<=n/i;j++){
			pre_sum+=(sum[n-(j-1)*i]-sum[n-j*i])*(sum[n-(j-1)*i]-sum[n-j*i])%mod*inv_num%mod*inv_num%mod;
			pre_sum%=mod;
			sumr[i].push_back(pre_sum);
		}
	}
	while(q--){
		int l,r;
		scanf("%d %d",&l,&r);
		r=min(r,l*2-1);
		int cnt=n/l,remain=n%l;
		if((long long)cnt*r>=n){
			if(l==r){
				printf("%lld\n",suml[l][cnt]);
			}
			else{
				int r_cnt=remain/(r-l);
				int l_cnt=cnt-r_cnt;
				if(remain%(r-l)){
					l_cnt--;
				}
				long long ans=0;
				ans+=suml[r][r_cnt];
				ans%=mod;
				ans+=sumr[l][l_cnt];
				ans%=mod;
				long long inv_num=inv(n-r*r_cnt-l*l_cnt);
				ans+=(sum[n-l*l_cnt]-sum[r*r_cnt])*(sum[n-l*l_cnt]-sum[r*r_cnt])%mod*inv_num%mod*inv_num%mod;
				ans%=mod;
				printf("%lld\n",ans);
			}
		}
		else{
			printf("-1\n");
		}
	}
	return 0;
}

M. 哈姆星与古地球学术行为影响星球文明的考古学分析

被破在赛时学习古地球语,知道这对我遭成了多大的影响吗。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	printf("D");
	return 0;
}
posted @ 2025-12-24 09:01  Oken喵~  阅读(5)  评论(0)    收藏  举报