51nod题解小集

版权声明:原创文章,转载要注明作者哦 https://blog.csdn.net/DYT_B/article/details/82950606

1406:f[x]表示与x相与之后值为x的数的个数。转移就是删掉某一个二进制位上的1。但是如果先枚举当前的值,再枚举删掉那一位会产生重复(一个数删掉一个位上的1或者删掉另外一个位上的1最后都会转移到同时删掉这两个1的情况)。那么我们可以改一下循环的顺序,先枚举删掉的位,再枚举当前的数,就不会有重复啦23333

1407:这题是上一题的升级版本。考虑容斥。要求出相与后1的位数为x的对数只要求出相与后为1的对数大于等于1的对数,然后再容斥一下。那么只要知道相与之后为x的对数怎样求就解决了。然后这里用一下上一题的结论就好了。

1426:注意到一个性质,括号序列不匹配的原因有且仅有一个,对于某一个前缀右括号数量大于左括号数量。那么我们可以考虑经典的线段树合并。对于一个区间,记录它多出来无法匹配的左括号数量和右括号数量,以及它的最多匹配数。然后对于两个区间,合并它们的答案。查询时求一求就好啦。

1254:考虑枚举一个被替换的点。先求出它在原序列中的最大子段。然后再找一个不包含在这个最大子段中的最大值,看看与它交换是否能变得更优,修正答案。

1269:如果每一个盒子里的花的数量都大于K,就相当于方程:x1+x2+…+xn=K,方案数就可以用隔板法来求 C n 1 n 1 + k C^{n-1+k}_{n-1} 。但是不一定满足这个条件。我们看到n比较小,所以只要暴枚那些位被当成大于K,然后容斥一下就好啦。

1122:一开始想了奇怪的排列组合。。。其实直接构造出矩阵:
1110 1 1 1 0
1101 1 1 0 1
1011 1 0 1 1
0111 0 1 1 1
在这里我给四个格子标的号是:
12 1 2
34 3 4
然后每一次移动就可以看作是这个矩阵的一次自乘。
所以只要求这个矩阵的N次幂,然后枚举一个排列,加和一下就好了。

1173:其实这个相隔k堆是没用的。因为题目中说一定有答案。我们可以根据相隔k堆这个条件把n堆分成若干个可以交换的环,分别处理出答案。而分别处理的答案就和不相隔k堆的一道题一样,求一下中位数,计算答案。

1175:主席树板子

1180:最简单的反演

1528:这题我们可以考虑单独计算每一位的贡献。那么对于这一位前面有几个数字在当前划分中与它属于同一个数字其实是不会影响答案的。但是后面有多少个是会对答案产生影响的。那么我们不妨对于拥有相同长度后缀的位置一起算。我们假设枚举当前的数有x位的后缀(包括当前位),那么这个后缀之后肯定有一个+号。剩下的n-x-1个空位里要放k-1个加号,直接组合数就好了。注意要特判最后一个有长度为x的后缀的数字,因为它的后面不用补+。

1444:首先有一个贪心,如果只有一条路,那么肯定直接取S到T的最短路,其它的边都删掉就好了。但是有两对点,就有另外一种可能性,就是两条路径在中间某一段合并成一条。显然可以证明一定是只有连续的一段合并成一条,而不是多段。那么只要暴枚哪一段合并就好了(注意s和t可以互换,所以有两种对应情况)。

猜你喜欢

转载自blog.csdn.net/DYT_B/article/details/82950606