摘要: 知道按位贪心但是不知道怎么贪…… 求一个a的异或前缀和s,然后按位从大到小贪心,ans的当前位能为0的条件是s中有 =m个位置这一位为0且没有flag,并且s[n]的这一位为0 如果符合要求,那么把s中这一位不为0的位置都打上flag,表示这些点不能作为区间断点了(如果作为断点的话这一位就要为1了, 阅读全文
posted @ 2018-09-12 20:16 lokiii 阅读(147) 评论(0) 推荐(0) 编辑
摘要: bzoj上访问负下标会跑到奇怪的地方…… 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i 1][j],f[i 1][max(min(j a[i]+1,n), n)]+b[i]) 注意到只有 n inclu 阅读全文
posted @ 2018-09-12 19:38 lokiii 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0 所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可 cpp include include using namespace std; const int N=45; int n,m,f[N][N][N],a[N][N] 阅读全文
posted @ 2018-09-12 16:44 lokiii 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 以后写dp还是向后转移吧……写的把前面加起来的版本怎么也调不过去 首先注意,因为地图碎片只占1体积,所以 n, include using namespace std; const int N=405; int n,l,m,a[N]; double p[N],f[2][N][N],ans; int 阅读全文
posted @ 2018-09-12 11:40 lokiii 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 cpp include include include using namespace std; const int N=100005; int n,m,k,f[N],h[N],cnt,va 阅读全文
posted @ 2018-09-12 09:44 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 没考虑可以连着两个不选……直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点,g[u]为不选u点,然后随便转移一下就行了 cpp include include using n 阅读全文
posted @ 2018-09-12 09:08 lokiii 阅读(129) 评论(0) 推荐(0) 编辑