[比赛|考试]nowcoder NOIP提高组组第二场
160/300pts,rank16(100,30,30)
在自身找毛病,首先做题感觉还不不够认真,比如T3那个我一开始审出来了,然后tmd忘了。。。gg。。。T1AC没啥好赞美的,T2T3暴力没拿全啊。。。
sjzez大佬ztb180pts太强了相比我这个连树剖都不会写的就是个菜狗啊
吐槽T1动态题面,除了T1动态题面,另外两道题都很吼哇(反正我做不出来的题都很吼)(不过感觉ranklist前几页都是T1AC的)
下面是题解
T1.方差
一个长度为\(m\)的序列\(b[1\cdots m]\),我们定义它的方差为\(\displaystyle \frac 1 m \sum_{i=1}^m(b_i-\bar b)\)其中 \(b\)表示序列的平均值。
可以证明的是,如果序列元素均为整数,那么方差乘以\(m^2\)之后,得到的值一定是整数。
现在有一个长度为\(N\)的序列\(a[1\cdots N]\),对每个\(i = 1\)~$ N$,你需要计算,如果我们删除 \(a[i]\),剩下的 \(N-1\) 个元素的方差乘以 \((N-1)^2\) 的值。
下面我们令\(\displaystyle s=\sum_{i=1}^mb_i\)
推推式子,对于序列b的方差乘以\(m^2\),即
\(\displaystyle m \sum_{i=1}^m(b_i-\bar b)\\\displaystyle=m\sum_{i=1}^mb_i^2-2m\sum_{i=1}^mb_i\bar b+m\sum_{i=1}^m\bar b^2\\\displaystyle=m\sum_{i=1}^mb_i^2-2m\bar b\sum_{i=1}^mb_i+m\bar b^2\sum_{i=1}^m1\\\displaystyle=m\sum_{i=1}^mb_i^2-2s\sum_{i=1}^mb_i+m^2\bar b^2\\\displaystyle=m\sum_{i=1}^mb_i^2-2s^2+s^2\\\displaystyle=m\sum_{i=1}^mb_i^2-s^2\)
所以我们只需要处理所有数的平方和,所有数的和就行了。注意精度问题(开long long就够了,请看下面代码的注释)
#include <bits/stdc++.h>
using namespace std;
int a[100010], sqra[100010], n;
long long tot, sqrtot;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);//1e4
sqra[i] = a[i] * a[i];//1e8
tot += a[i];//1e9
sqrtot += sqra[i];//1e13
}
for (int i = 1; i <= n; i++)
{
long long fuck1 = sqrtot - sqra[i];//1e13
long long fuck2 = tot - a[i];//1e9
printf("%lld%c", (n - 1) * fuck1 - fuck2 * fuck2, i == n ? '\n' : ' ');//1e18
}
return 0;
}
T2.分糖果
N 个小朋友围成一圈,你有无穷个糖果,想把其中一些分给他们。
从某个小朋友开始,我们顺时针给他们标号为 1 ~ N。第 i 个小朋友可以得到至多 a[i],至少 1 个糖果。
问,有多少种分配方案使得每一对相邻的小朋友拿到的糖果数不同。答案对 10^9 + 7 取模。
对全部的测试数据,n <= 10^6, a_i <= 10^9
- 10 分的数据,n <= 4
- 10 分的数据,n <= 100, a_i <= 20
- 20 分的数据,n <= 100, a_i <= 100
- 10 分的数据,n <= 10^5, a_i 全部相等
- 30 分的数据,n <= 10^5, a_i 为随机生成
- 20 分的数据,n <= 10^6.
我的预计是骗前50分,最后拿到30分(懒得去找哪里出锅了)。对于\(n\le100,a_i\le100\)的情况,可以直接暴力dp。\(a_i\)全部相等参见pj组T3,打递推or通项。
正解要搞搞rc原理什么的,反正我不透彻,不放代码了
T3.集合划分
visit_world 得到了 {1, 2, ... , n} 的 (2^n - 1) 个非空子集,他计划把这些集合分给小 S 和小 T,每个子集恰好给其中一个人。
分配规则是这样的:
\1. 若存在两个集合属于同一个人,那么这两个集合的并也要属于那个人
\2. 有 m 个集合是小 S 特别喜欢的,你要把这些集合全部给小 S
\3. 小 S 拿到了恰好 k 个集合。
请给出一种方案,或者说明无解。
有30分部分分是m=0的,我写了个假的贪心(太tm假了)当时我都没看出来,直到群里某人提醒。。。
这题特别难,全场1人AC。。。
m=0时候是一个二进制拆分构造什么的
m>0的时候反正各种xjb推不会
以后遇到这种题有两种思路一个是暴力一个是贪心
贪心不对我tm模拟退火,遗传啊
正解不想再透彻一遍了············
作为bruteforce选手,希望下一次tg组赛能拿稳了暴力分,Wannafly比赛好像就是让我掉rating的。。。不过计rating的好像除了tg就Wannafly了