比赛时间安排
7.30-7.50
t1 又是本质不同?!又是sam?不可能不可能,好好看看,发现样例推不过!弃疗
t2 暴力挺简单的,而且貌似能O(n^2)预处理过30
t3 暴力dfs就行
7.50-8.00
先把t2的最暴力的写了,然后预处理优化,没问题,31分
8.00-8.10
t3的dfs写完了
8.10-8.15
把t2的k=1写了(之前没写因为没看见)
8.15-8.40
t3打表发现a+b=n+1时候是个杨辉三角
8.40-9.40
又去看了一下t1,题意总算弄明白了,暴力n^7可写哈哈哈
写完之后去打表发现aij是全排列时候的规律,这个过程挺曲折的,我大眼一看没什么规律,不过发现n=1的时候是m*(m+1)/2,n=2是n=1的4倍,n=3是n=1的10倍,感觉没规律,把这些倍数作差,发现每次增加的是n*(n+1)/2,于是非常激动地把这个写了上去(怎么wa了呢o(╥﹏╥)o)
9.40-10.30
细想t1还有没有没有拿到的分数,想试试能不能进行预处理之类的东西,发现并不行,然后对于<10的也没有什么想法,决定先去写后面的吧
t2我观察到k<=3,想到向量内积那个题了,就是推性质嘛,于是我很快发现k=2的时候,其实就是找偶数的位置,然后计算一下贡献,我想的是找到每个偶数点,那么包含他的区间一定合法,只要快速求出这个东西就没事了,然后就一直推推推推推……自闭了
10.30-12.00
我只能把希望寄托于t3了,看到15的数据,我觉得我可以冲一下。
我先思考,其实n能把整个序列分成两部分,变成 / \这个趋势,那么我只要枚举一下n的位置,然后把两边的一乘就行了!!非常激动(其实这个过程我想了20分钟)
而且还有一点,两边不管分配什么数字,最后都能被离散化成1~i,那么只需要成一个组合数,且两边都能使用同一个dp,所以dp数组就设出来了
f
[
i
]
[
j
]
[
k
]
[
t
]
f[i][j][k][t]
f[i][j][k][t]表示在
1
到
i
1到i
1到i中选数,已经选了
j
j
j个,当前
j
j
j个数的最大值是
k
k
k,有
t
t
t个递增的
然后就写,写完了之后几经周折,终于小数据对了,然后我发现
i
i
i根本没用,就删了,变成3维,貌似卡一卡能过200!!!!激动的我赶紧对拍,发现5之后的数据都不对了
然后就是调bug,把dp的思路一遍又一遍捋,但是可惜,最后还是不知道哪里错了
赛后总结反思
- t1可以用字符串hash,这个套路竟然忘掉了,不应该
- t3的思路和73分的完全一致,就是dp设置太复杂,转移太复杂,不过相比于之前一头雾水,已经有很大进步了!
- 整体下来,几乎没有闲下来的时间,都很有用,时间安排上比之前好一些
- t2,k=2的时候可以转变成对每一个左端点算贡献,总之不是非常难想的做法,应该想到
与正解的差距
T1
暴力20分有个做法是去讨论每一行的贡献应该是多少,只需要找到在哪些矩阵中这一行第一次出现就行了,也就是要找一个上界,用上面的部分乘上下面的部分就行(下面直接到底,因为就算下面有重复的,当前这一行也是第一个出现的,也会产生贡献)
正解是trie树,合并
把每一行看成字符串,建出trie树,在每个结点上用set维护,当前这个串出现在第几行,(因为在trie树同一节点上的串一定完全相同)这样实现边插边计算贡献(计算的时候上界和下届都要求)
这样只计算了以第一列开头的串的贡献,那么我们就把第一层合并成一个新根,这样就能计算第二层了,以此类推
T2
正解用只会更改log次值的性质,减少了循环次数,并且枚举每一个左端点,算后面有多少个右端点能产生贡献,这个技巧也应该掌握,因为左端点是从后向前的,所以就约等于搞了一个后缀和,统计答案也很方便
T3
表示73分的思路和我的一模一样啊
区别就是状态设置,73分的少一维,用
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示在
1
i
1~i
1 i中选树,最大值是
i
i
i,选了
j
j
j个数的方案数,其实我也想到可以把最大值的那一维去掉,可是发现转移就出现问题了,所以最后没删(依然错了)。这个转移就很巧妙。
F
[
i
]
[
j
]
=
F
[
i
−
1
]
[
j
−
1
]
+
F
[
i
−
1
]
[
j
]
×
(
i
−
1
)
F[i][j]=F[i-1][j-1]+F[i-1][j]\times(i-1)
F[i][j]=F[i−1][j−1]+F[i−1][j]×(i−1)
前一部分是第
j
j
j个数选
i
i
i,后一部分是第
j
j
j个数不选
i
i
i,那么我们可以先让他选
i
i
i,然后再从前面
i
−
1
i-1
i−1个数里任意选一个,和他交换位置,就好啦