
Mark
文章平均质量分 68
Neutralzz
这个作者很懒,什么都没留下…
展开
-
Codeforces 689D Friends and Subsequences(RMQ+二分)
题意:大小为n的序列a和b中,求(l,r)的个数,使得max(a[l..r]) = min(b[l...r])。解析:在固定l后,随着r的增加,max(a[l..r]) - min(b[l...r])是不减的。所以可以通过二分求得max(a[l..r]) = min(b[l...r])的两个边界。[code]:#include#include#include#includeu原创 2016-07-09 08:52:54 · 655 阅读 · 0 评论 -
Light OJ 1415 Save the Trees (dp+块状数组)
解析:设dp[i]为考虑前i棵树的最小收益。那么dp[i] = min(dp[j]+max(h[j+1...i]));显然不能直接状态转移,但是又想不出logn的做法,于是就套上了块状数组。[code]:#include#include#include#include#includeusing namespace std;typedef long long L原创 2016-04-23 10:46:09 · 518 阅读 · 0 评论 -
Light OJ 1342 - Aladdin and the Magical Sticks (概率DP)
解析:设dp[i][j]为有i个未放入的可辨别的砖块和j个未放入的不可辨别的砖块时,放入不可辨别的砖块的重量期望值。num1,tot1分别是可辨别砖块的个数和重量和;num2,tot2分别是不可辨别砖块的个数和重量和。那么dp[i][j] = (num2-j)*dp[i][j]/(i+num2) + j*dp[i][j-1]/(i+num2) + i*dp[i-1][j]/(i+num原创 2016-04-16 23:38:00 · 377 阅读 · 0 评论 -
Light OJ 1420 - Subsequences forming Strings (DP)
解析:设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从A中取得的方案数。设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从B中取得的方案数。状态转移方程: dp[i][j][k][0] = (dp[i][j-1][k][0] + (s[2][i]==s[0][j]?原创 2016-04-16 11:54:21 · 305 阅读 · 0 评论 -
Light OJ 1302 Independent Attacking Zones(分治或DP)
解析:对于[1...n],将第n个队伍和[1...n-1]中的两个队伍i,j构成一个三角形,那么 ans[1...n] = ans[1...i-1]*ans[i+1...j-1]*ans[j+1...n][code]:#include#include#include using namespace std;typedef long long LL; char s[75原创 2016-04-16 11:49:38 · 420 阅读 · 0 评论 -
Light OJ 1274 Beating the Dataset (推公式)
解析:首先算出yes的个数m首先答案要加上第一个结果是no的情况数,然后那么第i和第i+1个结果是yes no或no yes,答案就要加上对应的情况数。[code]:#include#include#include using namespace std; int n,m; int main(){ int i,j,cas; scanf("%d",&c原创 2016-04-16 11:44:02 · 503 阅读 · 0 评论 -
Light OJ 1299 Fantasy Cricket (DP)
参考:点击打开链接解析:dp[i][j]为前i个字符 有j个U没有确定位置的方案数。则dp[i][j] = dp[i-1][j]*j+dp[i-1][j+1]*(j+1)*(j+1) (s[i] = 'D')dp[i][j] = dp[i-1][j-1]+dp[i-1][j]*j (s[i] = 'U')[code]:#include#include#incl原创 2016-04-14 19:07:51 · 395 阅读 · 0 评论 -
Light OJ 1295 Lighting System Design (DP)
解析:将灯按v排序后记录一下数量的前缀和,然后dp就好了。dp[i] = max(dp[j]+Ki+Ci*sigma(L[j+1...i]));[code]:#include#include#include#define th(x) this->x=x;using namespace std;struct Node{ int v,k,c,l;原创 2016-04-14 13:58:48 · 349 阅读 · 0 评论 -
Light OJ 1270 Tiles (II) (状压DP)
解析:显然的状压DP,每一行怎么填补空缺用搜索就好,就是繁琐了些。[code]:#include#include#include using namespace std;typedef unsigned long long LL; char s[105][105];int n,m,a[105],b[8],c[8],d;LL dp[105][1<<8],tmp_原创 2016-04-14 13:54:19 · 233 阅读 · 0 评论 -
Light OJ 1277 Looking for a Subsequence
解析:先用二分求出以a[i]为首的最长子序列长度,往后贪心着取就是了。[code]:#include#include#include#include #define pb push_backusing namespace std;const int maxn = 1e5+5;const int INF = 0x3f3f3f3f; int n,m,a[maxn],b[原创 2016-04-14 13:46:30 · 285 阅读 · 0 评论 -
HDU 4595 Similar Number (主席树)
解析:首先,求出对于每一个位置i,以第i个元素结尾的相似序列的最大长度和最小长度,用lb[i]和rb[i]记录对应的位置,形成一个三元组(i,lb[i],rb[i])。这个可以通过递推在O(n)内求出,然后将三元组映射成二维平面的线段(i是纵坐标,lb[i],rb[i]是左右端点的横坐标)。对于[l,r]的查询,就是对纵坐标[1,r]的所有线段中位于[l,r]的和。用主席树就可以实现。原创 2016-03-28 21:42:55 · 463 阅读 · 0 评论 -
Light OJ 1382 The Queue(树形DP+数学)
题意:n个人排队,每个人b除CEO外都有一个监督人a,b必须排在a的后面,问有多少排队方案。解析:显然是一个树形DP。设dp[i]为以i为根的子树中对应的方案数,num[i]是以i为根的子树的节点数。下面考虑将两个队伍v1,v2合并一个队伍。其对应的方案数为C(num[v1]+num[v2],num[v1])*dp[v1]*dp[v2]。依据这个进行dfs。[code]:#原创 2016-02-18 23:37:30 · 410 阅读 · 0 评论 -
Light OJ 1092 Lighted Panels (状压)
解析:可以参考POJ 3279。不同的是这里要把最上面一行和最左一行一起状压。[code]:#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;char mp[10][10];int n,m,state[10][10],flip[10][10];void init(){ i原创 2016-03-25 11:52:38 · 382 阅读 · 0 评论 -
LightOJ 1073 DNA Sequence (状压DP+字符串比较)
题意:给出n个字符串,求包含这n个字符串为子串的最短的串,如果有多个满足条件的字符串,输出字典序最小的字符串。解析:求串的最短长度非常容易,KMP处理出一个L[i][j](将i拼接到j的前面需要增加的最少的字符数),然后状压DP即可。难住我的是字典序最小。。。不过最后的做法估计的效率应该也不是最好的。。在DP转移的时候记录其前驱,在更新的时候如果长度相等,就和原先的前驱进行比较。关键是原创 2016-03-24 21:16:25 · 612 阅读 · 0 评论 -
Light OJ 1264 Grouping Friends (DP+枚举子集)
题意:将所有人分若干组,使得每组的不满意值的和最小。解析:预处理出来每个可能的组的不满意值,再枚举一下自己即可。[code]:#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;int n,d[15][15],f[1<<15],dp[1<<15];void sol(){原创 2016-04-05 12:24:54 · 406 阅读 · 0 评论 -
Light OJ 1252 Maintaining Communities (树形DP)
状态真是不如去年现场赛的时候了,这么一个简单的树形DP都写出了俩bug。。。解析:设dp[u][j]为维护u所在的子树,且u所在连通块的花费为j的最少连通块数目。令v是u的子节点,w为其边权若将v所在的连通块与u分离,则dp[u][j] = dp[u][j]+min(dp[v][t]) (0若将v所在的连通块与u连接,则dp[u][j] = min(dp[u][j-w-t]+d原创 2016-04-05 09:46:54 · 548 阅读 · 0 评论 -
LightOJ 1018 状压DP
解析:这个题目的关键就是在于怎么把复杂度降到O(n*2^n)状压是肯定会想到的,可一般的思路是枚举线来进行状压,这样O(n^2*2^n)是会TLE的。正确的降复杂度的方法是:枚举线的时候固定一个点,再枚举其他的点形成一条线(因为每一个点都是必须要被某条线覆盖的这样就讲了一个n的复杂度。[code]:#include#include#includeusing na原创 2016-03-22 18:52:34 · 445 阅读 · 0 评论 -
Codeforces 665E Beautiful Subarrays (Trie树)
题意:找出异或和>=k的连续子序列个数。官方题解:http://codeforces.com/blog/entry/44466[code]:#include#includeusing namespace std;typedef long long LL;const int maxn = 1e6+5;const int ML = 30;struct Nod{ in原创 2016-05-04 15:36:10 · 319 阅读 · 0 评论 -
Light OJ 1394 Disable the Wand (数位DP)
解析:dp值设为pair 同时记录个数和sum,套模板。[code]:#include#include#include#includeusing namespace std;typedef long long LL;typedef pair PLL;PLL dp[35][35][35][3][7];int s1,s2,ideal[32];int bit[35],to原创 2016-04-23 21:29:35 · 434 阅读 · 0 评论 -
LightOJ 1364 Expected Cards (概率DP)
解析:设dp[c][d][h][s][i][j]为有c,d,h,s个对应的牌,i、j记录大小王的状态。记忆化搜索一下就ok[code]:#include#include#includeusing namespace std;int C,D,H,S,cnt[5];double dp[15][15][15][15][5][5];void init(){ int原创 2016-04-24 21:31:38 · 1039 阅读 · 0 评论 -
HDU 5729 Rigid Frameworks (连通二分图计数DP)
参考1:http://blog.youkuaiyun.com/dpppbr/article/details/51972196参考2:https://www.johannesbader.ch/2013/09/project-euler-problem-434-rigid-graphs/[code]:#include#include#includeusing namespace std;ty转载 2016-07-28 10:39:34 · 519 阅读 · 0 评论 -
HDU 5735 Born Slippy (分块+树上可持久化)
官方博客讲的很清楚:点击打开链接在这里贴一下做树上可持久化的代码仅供参考。[code]:#include#include#includeusing namespace std;typedef long long LL;const int maxn = (1<<16)+5;const int sqrn = (1<<8)+5;const int MOD = 1e9+7;原创 2016-07-27 14:56:43 · 403 阅读 · 0 评论 -
HDU 5758 Explorer Bo (树形DP)
题目:给你一棵树,用最少的链去覆盖这棵树,求链的最小总长度。解析:num为叶子节点数,显然链数是(num+1)/2。如果是偶数,就是叶子节点到叶子节点,如果是奇数,那么就是在奇数-1情况下的树下加一条叶子到其祖先的链。偶数的情况:从一个非叶子节点出发,如果其子节点的叶子节点是偶数,则ans+=2,如果是奇数,ans+=1。奇数的情况:枚举一下那条单链所在的子树。设dp[u][i][原创 2016-07-27 14:46:54 · 1045 阅读 · 0 评论 -
HDU 5297 Y sequencew(容斥+收敛迭代)
题目:从1开始的无限长正整数序列(1,2,3,4,5,...),剖去所有可以写成a^b的数(2解析:首先对于每一个r处理出对应容斥的数字,用vector记录下来以降低复杂度。开始的时候同样像的是二分,超时……看了一篇题解后,考虑序列的性质,向前迭代时是不断收敛的。(具体看代码)[code]:#include#include#include#include#include#原创 2016-07-06 10:25:23 · 275 阅读 · 0 评论 -
HDU 5296 Annoying problem (树状数组+dfs序+倍增)
题意:一颗n节点的带权无向树,一个初始为空的集合S,有两种操作:1 x 如果S中没有x,加入x ;2 x 如果S中存在x,删除x。每次操作完后求出使S集合连通的最小边权和。解析:设root为S集合的LCA。点i的左右时间戳为L[i],R[i],ans为当前的权重和。当前集合S中添加节点x,如果x不在root的子树中,那么ans += dis[x]+dis[root]-2*dis[lca(x原创 2016-07-06 10:15:30 · 381 阅读 · 0 评论 -
HDU 5293 Tree chain problem(树形DP+树链剖分)
题意:一颗n节点树上有m条链,每条链有权重,求一个链的集合使权重和最大且两两不相交。解析:令dp[i]为以i为根的子树的最大权重和。如果i不在链上,则有dp[i] = sigma(dp[k]) k为i的子节点如果i在某一条链(u,v,w)上,那么dp[i] = w + sigma(dp[k]) k为链上所有节点的子节点。对于该值,我们可以统计统计链上节点的所有子节点dp的和 - 链上节原创 2016-07-06 09:55:18 · 430 阅读 · 0 评论 -
Hdu 5352 MZL's City (最小费用最大流)
解析:源点S与所有的1查询连边,容量为K,所有的查询与相关的节点连边,容量为1,图中节点1~n与T连边,容量为1,解即是最大流量。通过控制费用,越早的查询费用越大,从而获得最小字典序。[code]:#include#include#include#include//#pragma comment(linker, "/STACK:102400000,102400000")#d原创 2016-07-13 21:13:31 · 448 阅读 · 0 评论 -
Hdu 5351 MZL's Border (找规律+Java高精度)
解析:找到最大的i是|fib_i| [code]:import java.util.*;import java.math.*;import java.io.*;public class Main{ static BigInteger m,f[] = new BigInteger[1001],mod = BigInteger.valueOf(258280327); static原创 2016-07-13 21:09:23 · 290 阅读 · 0 评论 -
Hdu 5348 MZL's endless loop (构造)
解析:每找到一个单个的环,将其指定顺序后从图中出,最后会得到一个森林,对于每一棵树,从根节点开始根据出入大小指定方向即可。注意实现细节![code]:#include#include#include#include#includeusing namespace std;typedef pair P;const int maxn = 1e5+5;const int ma原创 2016-07-13 21:02:32 · 297 阅读 · 0 评论 -
Hdu 5338 ZZX and Permutations(线段树+贪心)
解析:首先用set维护被Cirlcle Notation切开的不连续的各个段。然后从i开始,(p[i]为i的位置)找到其在set中的左右端点,左边的最大值为value_l,右边p[i]+1的值为value_r。若value_l>value_r,则{p[value_l],p[value_l]+1,...,p[i] }为一个CircleNotation,并再用set维护剩下的段。若原创 2016-07-13 20:42:45 · 290 阅读 · 0 评论 -
Hdu 5334 Virtual Participation (构造)
解析:首先找到第一个n使得n*(n+1)/2>=k,差值为x。然后看下面一个例子:28 = 1 2 3 4 5 6 727 = 1 1 3 4 5 6 726 = 1 1 3 3 4 5 625 = 1 1 1 4 5 6 724 = 1 1 1 4 4 6 723 = 1 1 1 4 4 6 622 = 1 1 1 4 4 4 721 = 1 2 3 4原创 2016-07-13 20:28:50 · 364 阅读 · 0 评论 -
Hdu 5325 Crazy Bobo (拓扑排序)
解析:对于原树一条边(a,b),令w[a] [code]:#include#include#include#include#includeusing namespace std;const int maxn = 5e5+5;struct Nod{ int b,next; void init(int b,int next){ this->原创 2016-07-10 20:36:33 · 324 阅读 · 0 评论 -
Hdu 5324 Boring Class (cdq分治)
解析:因为是最小字典序,所以从右往左DP。dp[i] = max(dp[j]+1) i =L[j],R[i]因为这是三维上的问题,自然的就能想到cdq分治了。在一个区间[l,r]内,先对[mid+1,r]递归,按L[]排序后建立一个对R的线段树,来计算[mid+1,r]的影响,再递归[l,r]。这里说的比较笼统,不过熟悉cdq分治的同学应该能立马明白我说的什么吧![code]:原创 2016-07-10 20:33:45 · 388 阅读 · 0 评论 -
Hdu 5318 The Goddess Of The Moon (dp+矩阵快速幂)
解析:dp[i][j]表示前 i 个数,以 第 j 个数结尾的方案数。因为每一层的转移都是相同的,所以处理出一个转移矩阵,通过快速幂即可快速求得结果。[code]:#include#include#include#include#includeusing namespace std;typedef long long LL;const LL INF = 0x3f3f3f3f原创 2016-07-10 20:09:59 · 333 阅读 · 0 评论 -
Hdu 5316 Magician (线段树区间合并)
解析:关键是处理奇偶的问题。正如官方题解所说,本题的子序列实际上可以根据起始数值下标的奇偶性分为四类。对于每一类,如果你熟悉线段树,那么可以看出这个问题是可以进行区间合并的。即如果知道一个区间[L, R]两个子区间 [L,mid], [mid+1,R]的信息,我们可以推出[L,R][L,R]的信息。维护四个值,表示起点终点的下标的奇偶性。[code]:#include#i原创 2016-07-10 20:02:19 · 273 阅读 · 0 评论 -
LightOJ 1352 Strange Summation(找规律or数位DP)
解析:将[l,r]的所有二进制数字左对齐后做不进位的加法运算后的值(注意是不进位!写一下找找规律就好。[code]:#include#includeusing namespace std;typedef unsigned long long LL;LL num[70];int top;void sol(LL n,int p){//printf("-> %llu原创 2016-04-24 23:20:13 · 615 阅读 · 0 评论 -
Light OJ 1228 e-Friends (状压DP)
解析:dp[S][i][k]为队列中以有S中的人,且队尾是i,不满意的个数为k的方案数。则dp[S][i][k] = sigma(dp[S^(1[code]:#include#include#includeusing namespace std;typedef long long LL;int n,m,q,mp[12][12];LL dp[1<<12][12][12];原创 2016-04-04 18:51:55 · 242 阅读 · 0 评论 -
Light OJ 1223 Testing Mailboxes (DP)
解析:记忆化一下就好,整体的复杂度是小于10^8的。[code]:#include#include#includeusing namespace std;typedef long long LL;const int INF = 0x3f3f3f3f;int n,m,dp[105][105][105];void init(){ int i,l,r; mem原创 2016-04-04 16:57:48 · 264 阅读 · 0 评论 -
Light OJ 1194 Colored T-Shirts (状压DP)
解析:举个例子,{2 1 4 3 1 2}目标序列{* * * * * *}假设我先把数字1放入目标序列尾部则有{* * * * 1 1} 交换次数为 5+6-2-5 = 4次(序列位置和的差)然后我把数字2放入尾部则有{* * 2 2 1 1} 则是再像上面那样做差得出的是3+4-1-6 = 0显然是不对的。因为1的位置的改变使第2个2的位置左移两位,所以应该是3+4-1-4原创 2016-04-04 15:20:33 · 351 阅读 · 0 评论 -
Light OJ 1027 A Dangerous Maze (概率题)
转自:http://blog.youkuaiyun.com/danceonly/article/details/16824745解析:定义一次选择选择到Xi是整数的概率为P1,选择到负数的概率是P2,然后选择了正数后平均在T1时间后出去, 选择了负数后平均在T2时间后回到原地。接着设出去的期望是Y,那么可以写出一个式子 :Y = P1 * T1 + P2 * (T2 + Y), 这样的话问题就得到了解决,转载 2016-02-02 14:28:39 · 385 阅读 · 0 评论