其他分享
首页 > 其他分享> > Codeforces Round #772 (Div. 2)

Codeforces Round #772 (Div. 2)

作者:互联网

A

大概是可以把两个数 \(x\) 和 \(y\) 替换成 \(a\) 和 \(b\),满足 \(x|y=a|b\),求最终的和最小。这东西直接贪心就好了,由于是或起来,最终序列内所有数的或和是不变的,那我们直接贪心构造,最终和一定是大于等于这个或和的,那我们把一个数变成或和,别的都是 \(0\),就是最小的和。

B

每次可以把一个数改成 \([1,10^9]\) 内的任意一个数,求最少多少次满足没有一个 \(i\) 使得 \(a_i>a_{i-1}\) 且 \(a_i>a_{i+1}\)。发现是严格大于,所以不难发现,等于是一个非常好的情况。于是考虑从前往后做,这时候贪心希望能把后面不合法的破坏掉。于是我们对于一个不合法的位置 \(i\),把 \(i+1\) 的位置赋值为 \(i+1\) 位置相邻两个中的最大值,这样假如说后面有一个位置不合法就把它啊掉了并且不会产生新的不合法位置。

C

考虑倒数第三个位置,只能变成最后两个数相减的结果。最后两个数都不能变。

然后假如说最后一个数是负数,那么对于位置 \(i\),它后面都是递增的,只有 \(a_i>a_{i+1}\)。那这个位置不可能变得比 \(a_{i+1}\) 小。

然后假如说最后一个数不是负数,那只有最后两个数是递减的时候是不行的,别的情况我们把每个位置赋值为最后两个数相减,题目允许等于。

所以分类判断以下就可以了。

D

考虑一个简化的问题,如果保证了,\(a\) 中的每个数间都不能通过这些操作变成相同的,也就是每个数间是独立的,那怎么做?直接令 \(dp_i\) 表示二进制有 \(i\) 位的数的个数,然后先把 \(dp[\operatorname{log}_2a_i]\) 都加一,然后做斐波那契的递推就好了。

问题是怎么去重。我们把 \(a[]\) 排序,容易发现,如果 \(a_i<a_j\) 并且 \(a_i\) 能够变成 \(a_j\),那么 \(a_j\) 能够通过在后面删去得到 \(a_i\)。

E

考虑对于每一对限制,两辆车的方向一定是不同的,所以对此我们可以黑白染色,然后对于每个连通块,就转化为给定若干组大小关系,求一组满足题意的解,这东西用拓扑跑一下就行了。

没写完。

F

标签:两个,772,一个,位置,最后,Codeforces,合法,Div,贪心
来源: https://www.cnblogs.com/ZCETHAN/p/15918445.html