T1:
解题情况:53pts(常数太大,TLE)
题意:初始n*m矩阵每个点有一个值a[i][j]<=n*m,k次操作,每次将一个子矩阵赋值成一个值w,若w!=a[i][j],vis[i][j]=1,求k次操作后∑vis[i][j]。
算法分析+题解:子矩阵赋值很容易想到差分,但是后面赋值会覆盖之前赋的值,考虑加上每一次的赋值,但是会出现这样一种情况:w[i]+w[j]==a[i][j],使得程序输出错误答案,因为多种值相加可能得到初始值,所以我们要使其尽量不得到相同答案,可以给每一种值hash,保证唯一性。(题解给的是随机数或二进制拆分算部分答案,时间复杂度都相同,但是常数和正确性看脸,显然我脸黑T_T)
小结:
1.能卡常都卡;
2.想到一种算法后根据算法的弊端优化(如本题中的hash)
T2:
解题情况:20pts
题意:a[i]=a[i]/2+[a%2==a/2%2],求∑i=1n a[i];
算法分析+题解:只会90pts的数位dp,f[i][j][k][l],到第i位,二进制拆分下a[i]=a[i-1]的位数为j,这一位二进制位为k,每一位是否同n的方案数,题解预处理没看懂。
T3:
解题情况:0pts(早上没写完)
题意:给出一颗大小为n的树,每个点有权值,m次操作,每次操作为以下三种之一:
1.将x的权值改成y;
2.将x的父节点变成y;
3.求每一个包括x的大小为y的连通块的点权积的和(y<=10)
算法分析+题解:因为y<=10,可以换跟dp设f[i][j]为在i的子树中包括x大小为j的连通块的积的和,对于第一种操作就先删对x祖先节点(距离<=10)的贡献修改值在加上对其祖先节点的贡献。对于第二种操作先删对原祖先节点贡献,加上父节点对原祖先节点贡献,删现父节点对祖先贡献,加上x对祖先节点贡献。对于第三种操作对x和x的祖先节点卷积即可。
原文:https://www.cnblogs.com/oierqingmo/p/13550223.html