20210615总结
怎么说呢,体验极差。
一开始看的 T1 ,没想到状压,大概在 7:50 感觉是背包硬算概率,设 (f[i][j]) 表示第 (i) 个数加成了 (j) 的概率。但这玩意没法算答案,因为不知道是什么时候做的,没法处理一个时间两个数都加的冲突。8:30 然后就放了放,去看T2。题解中是用了枚举那些步骤操作了 (a_i) ,这样就可以处理了同一个时间不能操作2个数的问题,而且时间 (m) 只有 10,很适合状压,一般的状压是对物品数 (n) 状压,我以为是按照时间枚举,就是到了时间 (i) 每个数的状态,这样假了。
很快想了一个 (n^4) 的算法 8:40?,码了很久,大概在9:20?,然后想到能用单调栈优化成 (n^2) 的,这个码的很快 9:40左右,拍了 100 组,没拍出来问题,感觉稳了,自闭了。后来被卡成 0 分了,原因:那种处理方法需要有点才能枚举到矩形,可能有些情况需要换一下 ((x,y)) 才能枚举到那个答案的矩形。干他娘的。
然后去看T3了,woc DDP?怀疑是老师故意出给我的。还有2个小时左右,打算先把递推式写出来,因为DDP要用矩阵乘法,dp式子不能太复杂,就尽量想一些简单的dp,最后实在不行了,打算写一个麻烦的dp,代码大概长这个样子
void dfs(int x)
{
memset(f[x],-0x3f,sizeof f[x]);
f[x][1]=0;
Graph(x){
dfs(y);
LL temp=-inf;
for(int j=1;j<=L;j++)
temp=max(temp,f[y][j]);
for(int j=2;j<=L;j++)
f[x][j]=max(f[x][j],f[y][j-1]-temp);
f[x][1]+=temp;
}
for(int i=2;i<=L;i++)
f[x][i]+=f[x][1];
for(int i=1;i<=L;i++)
f[x][i]+=w[x][i];
}
这玩意写成递推形式好难啊,我是真不会,题解还真这样转换的。
然后我就自闭了,写了个很麻烦的地推形式,矩阵大概 14*14,那么没修改一次大概就是 54880 次运算,然后我就自闭了。只有一直在考虑优化这个矩阵大小,到最后就没了。最后只把暴力交了上去。
反思
想了想,其实对于T3,(L=2) 和链的情况的递推式不是很麻烦,没有那么多max啥的,算了一下大概有65分,下回这种T3就不应该硬搞100分的,还是太那啥了,而且能力也不够。