高维前缀和sosdp
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
gym101669E Looping Playlist SEERC2017
https://codeforces.com/gym/101669/problem/E 猜了一下结论然而过了,有点惊喜。。。 首先把12种基调状态压缩预处理一下,然后高位前缀和维护一下超集,vis[mask]=true表示当前有的音调状态是存在某一种基调中的 然后我们知道给出的是环,所以我们把他拓展到2倍,然后找dp[i]-dp[i-n]就是截取这一段的最小值求出来就行了,求最小值就是i向后移动,然后mask更新,如果vis[mask]不行了,就说明[l,i]这一段不能再同一首歌中,所以l就要向右移动原创 2020-10-07 00:36:24 · 359 阅读 · 0 评论 -
codeforces1208F Bits And Pieces
https://codeforces.com/contest/1208/problem/F 首先肯定是枚举a[i]然后找到能使a[i]或起来最大的(a[k]&a[j]),因为a[j]&a[k]是被绑定的。 那么问题就转化成了如何快速找到能使a[i]最大的(a[k]&a[j]),那么我们从高位到低位考虑,如果这一位a[i]中是0,那么肯定想要或上这一位使得答案变大,其实就是看这一位的超集有没有两个数字他们的位置都在i的右边就行了。 那么很显然问题转化为了一个超集的高维前缀和,每一原创 2020-08-27 02:13:28 · 202 阅读 · 0 评论 -
ARC 100 E - Or Plus Max
https://atcoder.jp/contests/arc100/tasks/arc100_c 问题可以转化为f[k]=max(a[i]+a[j])(i|j==k),那么答案就是f[k]的前缀最大值 于是用高维前缀和就可以做了,枚举每一个j=0-n,如果i>>j&1,那么用i^(1<<j)的值去更新i位置上的值因为i^(1<<j)也是i的子集,i的两个子集或起来还是i的子集 #include<bits/stdc++.h> using nam原创 2020-08-27 00:04:06 · 251 阅读 · 0 评论