51nod题解小集

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} Cn1n1+k。但是不一定满足这个条件。我们看到n比较小,所以只要暴枚那些位被当成大于K,然后容斥一下就好啦。

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

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

1175:主席树板子

1180:最简单的反演

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

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

1711:这题看似不好做。我们可以先二分一下答案(mid)。那么问题就变为了求区间和小于等于mid的区间的个数。那么对于某一个区间[l,r]我们可以写出一个不等式,大概就是:
a [ l ] + . . . + a [ r ] r − l + 1 &lt; = m i d \frac{a[l]+...+a[r]}{r-l+1}&lt;=mid rl+1a[l]+...+a[r]<=mid 直接变形一下: ( a [ l ] − m i d ) + . . . + ( a [ r ] − m i d ) &lt; = 0 (a[l]-mid)+...+(a[r]-mid)&lt;=0 (a[l]mid)+...+(a[r]mid)<=0 我们对于 a [ x ] − m i d a[x]-mid a[x]mid 做一个前缀和(sum[x]),那么我们对于某一个x,我们要求的就是它后面sum值小于它的点个数,直接树状数组就好了。

1204:网上最流行的2倍并查集(大雾)

1074:具体数学上有这题,但是我没看懂???
有一个递推式子: f [ n ] = ( f [ n − 1 ] + k ) &ThinSpace; m o d &ThinSpace; n f[n]=(f[n−1]+k)\, mod\, n f[n]=(f[n1]+k)modn
但是我们发现递推还是会tle。但是我们发现当t很大了之后,k要加很多次才会mod一个n,所以这些部分可以一起做。这样复杂度就比较科学了(?)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值