虽然但是,我脑残没想出来(恼

先把所有可能出现常数但没有全被填满的常数项找出来,方法是求这一列的范围交集是否包含本列的常数且本列常数是否相等,这一官方题解里说的很清楚。

我虽然想到了求范围交集,但是因为赛时范围交集会影响后面的,所以直接否掉了(更恼。

考虑一列选完之后影响后面的出现还是因为单调不降的性质,所以我们可以直接求常数列的最长下降子序列即可,注意即使有的0是不重合的,但你考虑整体了话,求最长下降子序列还是正确的。

然后求完带有常数项的,先定下来常数项的,再求0项的,同样是求范围交(常数项定下来之后的范围交),选出范围交非空的就行了。

为何是对的?因为值得注意的是0项的选择是不会影响后面的选择的,首先只有相邻的0项行(或者说两个中间没有被常数行隔开的),假如现在考虑两个相邻的0项行,那么对应到单独一列里就是两个相邻的0,我们可以知道2个相邻的0项的范围是相等的,每一列都是这样了话,合并到一块相邻的0项行的交集还是相等的,所以对于范围交非空的相邻的0项行直接选择相同的即可。

那么现在还有一个问题,就是为何先选常数项列再选0项列是正确的?我们考虑选择常数列对于0项列选择的影响,考虑单行,首先有影响的还是原来是两个相邻的0,然后其中一个0被用常数填上了,单个看这个没有被填的0范围是发生变化的,比如原来是[l,r][l,r],现在变成[ai1,r][a_{i-1},r]ai1a_{i-1}为上一个0被填的值,现在考虑把这一列的0合并,因为这是常数列所以上面有个0原来的最左的范围就是ai1a_{i-1},所以不影响。

1 条评论

  • @ 2024-11-29 14:46:31

    给出一种思路。我觉得T2贪心就可以吧,完了T1反悔贪就可以。 T2:首先对于一行来说,在忽略0的情况下,如果他是单调不降的,那么这一行就一定可以变成单调不降的(因为单调不降,0可以直接等于其两边的值)。同理如果在忽略下不行,那就一定不行。因为尽量选A,所以行能变,就变。

    对于能变A行里的0,因为要保证单调,所以它的范围就是左右两个非0值。而对于不能变A的行的0,就把范围扩到 1~INF,好给后面凑列。

    先扫一遍行确定单调。再扫一遍给对应0加上范围即可。

    对于列,如果一个列里面有两个不同常数,那么一定统计不了。对于可能能统计的情况,如果是常数列(无0,全相同),直接统计入 B;

    如果是全0列,设 l=0,r=infl = 0,r = inf,用这一列的0的范围去缩小l,r范围,如果可以使 l > r 说明没法得到一个共同的数,形成常数列。

    如果是含0也含同一个常数。看看常数是否在每个0范围之内即可。

    注意,0的范围是已经保证了A最大了。只要在这个范围内得到的B就一定是对的

    • 1