解题:JSOI 2011 柠檬】的更多相关文章

题面 显然分出来的每段两端颜色相同,否则把一边归给旁边的答案不变劣,于是可以$O(n^2)$地dp了:设$dp[i]$表示到第$i$个位置为止的最优解,$dp[i]=dp[j]+a[i]*(s[j]-s[i]+1)^2$ $[a[i]==a[j]]$,其中s是每种颜色出现次数的前缀和 写成斜率的形式,然后发现对每个颜色来说,斜率$k=a_i*s_i$单增,横坐标$x=2*(s_j-1)$单增,对每个颜色用单调栈维护上凸壳并在上面二分求解 #include<cstdio> #include<…
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻花 A:麻花.包子,B:麻花 Input 输入数…
[题目链接] 点击打开链接 [算法] 考虑求每个人可以不分的方案 那么,对于每件物品,我们把它分成n份,每一份对应分给每一个人,有C(a[i]+n-1,m-1)种方案,而总方案数就是每种 物品方案数的乘积 然后,根据容斥原理,ans = 至少0人没分到特产 - 至少1人没分到特产 +  ... - C(m,m) * 没有一人分到 特产 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 2010 ; int i,n,m;…
目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单调队列优化 单调队列优化多重背包 \(w(i,j)\) 只含 \(i,j\) 和 \(ij\) 的项--斜率优化 决策单调性适用的原理--四边形不等式与决策单调性 注意本文未完结 写在前面 ACM 训练(复习)的时候重新学习了一下常见的 DP 转移的优化技巧,在学习的同时也有一些自己的理解,便一并总…
2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠军7题,与我们的预期非常接近. Problem A: Alice and Bob 出题人:章雍哲 (特别感谢Evolution队对该题解法的贡献) 这道题正规的做法需要讨论各种情况: 1)       没有1的情形,很显然,只需讨论(sum+n)的奇偶性 2)       全1的情形,对1的数量模3…
CrackME 2011 # 2 逆向练习解题思路 做题背景: 从朋友那里得到一道逆向题名字叫package,作为小菜的我当然要看一看啦,这名字辨识度太低我就按照运行的名字改成CrackME 2011 # 2. 题目链接: CrackME 2011 # 2.zip  (请到网盘里去找同名文件) 具体步骤: 首先这个程序没壳的 直接放到IDA里看一下,找到了存在加密算法的函数sub_4011D0 判断输入字符串的长度如果不为0,把输入字符串每一位进行x + x * string[x] * stri…
题面 本身求答案是简单的树上DP,只需要求出根到每个点路径上的最小值,然后考虑割连父亲的边还是割所有儿子即可,但是每次都这样做一次显然不能通过,考虑优化 用虚树来优化:虚树是针对树上一些点建出来的一棵树,上面只有这些点和它们的LCA.显然这样虚树的大小不会超过2*所选点数,这样在缩小了问题规模的同时还保留了原树的性质. 具体的建法: 0.预处理DFS序 1.将所选点按DFS序从小到大排序 2.用栈维护一条从根延伸下来的链,依次将排序后的点nde加入.若栈为空则直接入栈,否则设栈顶为top: 3.…
题面 数据范围看起来很像网络流诶(滚那 因为限制多而且强,数据范围也不大,我们考虑不直接求答案,而是转化为判定问题 可以发现第二个限制相对好满足,我们直接枚举这个限制就可以.具体来说是枚举所有行中的最大值$x$,然后下面那个式子移项就可以得到$a*tot>=b*x$,其中tot表示芯片的总数 然后发现第一个限制还是很强,不好满足.怎么办呢?正难则反,转化成补集的问题:先把所有能安的芯片都安了,然后扣出来合法的答案 那么现在我们要扣掉的芯片尽量少,同时还要先保证扣出来的结果合法,那考虑用最小费用最…
题面 从零开始的DP学习系列之叁 树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况 显然的二分答案,之后问题转化为用$m$个能覆盖$mid$范围的点能否覆盖所有的特殊点,用树形DP判断 设$unc[nde]$表示以$nde$为根(包含$nde$)的子树中最远的未被覆盖的特殊点的距离,$cov[nde]$以$nde$为根(包含$nde$)的子树中最近的选出的点的距离.有两个从儿子$goal[i]$获…
题面 0/1分数规划+树形背包检查 要求$\frac{\sum P_i}{\sum S_i}的最大值,$按照0/1分数规划的做法,二分一个mid之后把式子化成$\sum P_i=\sum S_i*mid$.然后相当于每个点$i$的点权是$P_i-S_i*mid$来做树形背包. 然而我并不太会树形背包=.= 设$dp[i][j]$表示以$i$为根的子树中选出$j$个物品的最优解,然后转移的时候 枚举子树->枚举已经合并好的部分->枚举一棵新子树 来转移 #include<cstdio>…