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;
}

浙公网安备 33010602011771号