自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Winterfell30' Blog

太弱了。。。

  • 博客(78)
  • 资源 (1)
  • 收藏
  • 关注

原创 HDU 5787 K-wolf Number

题意求区间[l,r]中有多少个数不存在连续k位含有相同的数位。思路比较裸的数位DP,但是因为刚开始没有想好思路就开始写后来调试挺长的时间。 因为K比较小,所以我们直接加4维状态分别表示前面取的四个数,每次加下一个的时候根据K判断一下就好了。有些不好处理的地方是010这种有前导零的,那么前导零我们统一用11这个数位取不到的数来表示就可以了。代码#include <stdio.h>#include

2016-11-01 15:27:23 528

原创 HDU 5781 ATM Mechine

题意取款机里面有0-K不确定的钱数,如果查询的钱数超过余额就会警告一次,否则不警告,求警告W次内猜到确定钱数的期望是多少。思路dp[i][j]表示还剩0~i的钱数时还可以被警告j次的期望。 那么得到 dp[i][j]=dp[k−1][j−1]∗ki+1+dp[i−k][j]∗i+1−ki+1+1dp[i][j] = dp[k-1][j-1] * \frac{k}{i+1}+dp[i-k][j]

2016-11-01 15:17:03 374

原创 HDOJ 5763 Another Meaning

题意给两个字符串a和b,b有两义性,求a一共有多少种可能的意思。思路首先KMP预处理出所有b是a子串的末尾位置,然后基础dp就可以了。 如果i位置是子串末尾则dp[i] = dp[i-1] + dp[i-lenb] + 1否则直接转移。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>

2016-10-26 00:30:49 356

原创 HDOJ 5769 Substring

题意求一个字符串有多少个不同的子串,要求这些子串都包含至少一次x字符。思路如果不考虑包含x字符的话,求不同子串个数是一个后缀数组经典问题(spoj 694)。考虑那个问题的做法:∑leni=1len−sa[i]−lcp[i]\sum_{i=1}^{len}{ len - sa[i] - lcp[i]},len-sa[i]就是sa[i]开头的串的个数,再减去sa[i-1]时减过的lcp[i],累加起来

2016-10-25 21:52:06 383

原创 HDOJ 5754 Life Winner Bo

题意在1,1处的国际象棋,两个人依次移动,走到n,m。 求King,Queen,knight,castle走法的时候谁会赢或者平局。思路国王就判断一下要走步数的奇偶性就可以了,都为偶数的时候G会胜利。 车走的时候相当于两堆石子每次取任意个,也就是说直接的nim,两个步数异或起来就可以了。或者考虑对称性也能得到。 女王走的时候因为多加了斜着走,就相当于两堆石子中多加入了同时取相同个数石子的操作就

2016-10-24 12:52:42 447

原创 HDOJ 5745 La Vie en rose (bitset优化DP)

题意字符串s和p,p可以交换相邻两个字符的位置但是只能交换一次。求每个s[i]到s[i+len(p)-1]是否能由p变化得到。思路dp[i][j][0/1/2]分别表示在s的i位置和p的j位置时p[j]与p[j-1]交换、不交换、与p[j+1]交换时是否能变换得到。 因为dp是一个bool数组所以我们可以用bitset表示第一维也就是母串的匹配情况,第二维滚动一下。对于s[i]和p[j]的匹配情况

2016-10-23 21:53:29 445

原创 HDOJ 5738 Eureka

题意给出一些点,求有多少个集合满足在所有其他点都在其中两个点中间。思路首先题目给的那个式子化简之后就变成了求点共线的组合数的问题。 首先想到通过斜率统计然后否定了因为精度不行然后考虑把斜率表示成向量的形式,但是向量会有平行的情况也不好处理。然后用了这种固定一个点来求贡献的做法,不需要考虑平行也不需要考虑精度,唯一需要考虑的就是重点的问题了。单独考虑重点的时候集合就是2num−1−12^{num-1

2016-10-23 21:38:27 472

原创 HDOJ 5724 Chess (SG)

题意有n排列数为20的格子,有些行的有些格子放有棋子,每次可以把一个棋子向右移动一个格子,也可以从别的棋子上面跳过去,不能走的人即为输,判断这个人输赢。思路加深了一下对求SG表的记忆,其实就是类似DP的考虑当前状态可以通过一步变成什么子问题的状态,然后就求子问题中不存在的mex就行了。 这个题在算某个行的状态的时候把每一行状压一下然后枚举下一步的子问题就可以了。代码#include <stdio.

2016-10-23 21:21:04 345

原创 Codeforces Gym 100513

前面这些题都是一些模拟贪心= =描述还都很长。。。100513I - Sale in GameStore可以买任意一个游戏,然后可以选任意个加起来价值小于这个游戏的求最多能有几个。#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace

2016-10-22 14:19:29 558

原创 POJ 1743 Musical Theme (二分后缀数组LCP)

题意给出一段长度小于2e4的序列,如果有两个不重叠子段的一一相邻两个数之间变化情况相同就可以说这两段的是相同的theme。小于5视为0。思路首先我们先对序列进行处理,a[i] = a[i+1] - a[i],新序列即为变化情况的数列,问题转化成找到新序列的最长不重叠子段。 二分答案x然后可以利用lcp数组的性质找到所有符合条件的最左起点和最右起点,判断和x的大小关系即可。代码#include <s

2016-10-20 18:09:56 391

原创 HDOJ 3537 Daizhenyang's Coin

题意给出一些正面朝上的硬币的位置,每次可以将一个或者两个或者三个硬币翻面。最右边一个硬币必须是正面的,最后不能操作的人输。思路SG打出表,然后能发现SG(n)是有规律的,当2n的二进制位的1的个数是奇数时SG(n)=2*n,否则是2*n+1。 这个规律的证明网上有很多不再赘述,附上SG打表代码。代码#include <stdio.h>#include <string.h>#include <i

2016-08-04 01:03:12 599

原创 HDOJ 5807 Keep In Touch

A - Maximum Increase求最长连续子串长度int a[maxn];int main(){ //freopen("H:\\in.txt","r",stdin); //freopen("H:\\out.txt","w",stdout); int n; scanf("%d", &n); int ans = 0, mmax = 0, now = 1;

2016-08-01 17:17:00 450

原创 Codeforces 689D Friends and Subsequences (RMQ+二分)

题意求有多少对区间满足其中一个区间的最大值等于另一个区间的最小值。思路首先RMQ预处理出所有区间的最大值和最小值(线段树会超时。。。) 然后因为我们固定这两个区间的左端点枚举区间的右端点,因为右端点越大max越大min越小,所以是满足二分的单调性的。 所以这题的做法就是枚举左端点,二分右端点的max == min的左边界l和右边界r,即[i,l]到[i,r]的区间都是满足max等于min的,统计

2016-07-16 22:52:56 505

原创 HDOJ 3938 Portal (离线并查集)

题意给出一个带边权的图,令两个点之间的路径的费用为中途经过的边的最大值,对每个查询求有多少对点路径费用小于等于给定的L。思路用类似kruskal的思想,每个点都设置一个sum数组表示它所相连的所有满足小于当前L的边相连的点有多少个(其实数组名用size更合适)。 然后对于每次查询L,因为边我们也是升序排序的,所以对于所有小于L的边都有sum[find(edge[i].u)]*sum[find(ed

2016-07-10 16:23:08 411

原创 HDOJ 1811 Rank of Tetris (并查集+topo)

题意给出一些人之间的rating高低或等于关系,判断给出的关系是否冲突,能不能通过这些排出所有人。思路如果没有等于的话这个题是个比较经典的拓扑排序,加上等于之后我们每次相等的两边的关系需要合并,所以用并查集专门维护一下相等时的关系集合,其他的拓扑排序来做即可。代码#include <stdio.h>#include <string.h>#include <iostream>#include <

2016-07-10 16:12:43 436

原创 Codeforces Round #360 (Div. 2)

A按照题意暴力找一下char s[110];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n, d; scanf("%d%d", &n, &d); int last = -1, ans = 0; for (int i = 0; i < d

2016-07-01 16:13:22 376

原创 POJ1717 Dominoes (背包)

题意每个牌子由上部分和下部分构成,可以180度翻转,求令上部分和下部分的差值最小时的翻转次数。思路dp[i][j]表示当前为第i个格子,上面的和减去下面的差为j时最少翻转个数。因为有正有负所以加个maxn,然后因为数组再滚动一下就可以了。 刚开始WA了后来把内层循环直接改成6000到-6000就过了,还有一个可能RE的地方是sum的上下的和,最大是12000不是6000。代码#include <s

2016-06-30 15:36:23 927

原创 Codeforces 686 D Kay and Snowflake (树重心)

题意给出n个节点的树和q个查询(范围均为3e5),对每个查询输出x为根节点的子树的重心。思路树的重心有几个很好用的性质,下文参考这里 1.树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。 2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。 3.把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。

2016-06-27 23:17:06 924

原创 Codeforces 571B Minimization (DP)

题意有一个n个数的序列,给出一个k,可以通过对序列重排让∑n−ki=1|Ai−Ai+k|\sum_{i=1}^{n-k}|A_{i}-A_{i+k}|最小,求最小值。思路题目相当于分成k组,使得{0,k,2k…},{1,k+1,2k+1…}等这些序列分别的序列更小。 显然对于每一个链就是排序之后得到的绝对值的和最小,通过列项相消就能得到对于序列i他的结果就maxi−minimax_i-min_i

2016-06-17 15:04:03 435

原创 LightOJ 1051 Good or Bad (递推DP)

题意如果一个字符串含有连续的3个元音或者连续的5个辅音那么他就是bad的,否则他就是good的,字符串中含有’?’,’?’有可能是任何字母,如果因为问号不确定的话就是mix。思路因为数据很小所以刚开始直接考虑模拟,但是问号的处理很麻烦,换成了dp的做法。 dp的方程还是比较显然的,但是同样是mixed不太好判断。 dp[0/1][i][j]表示在i前第j个位时元音和辅音的情况,最后判断good即

2016-06-16 00:02:06 448

原创 51NOD 1259 整数划分 (五边形定理)

题意将N分为若干个整数的和,求有多少种不同的划分方式。思路几个月前妄图用DP过这题失败了= =,今天队友问起这题才想起来我还没过,看到discuss说用五边形定理赶紧去学习了一波。。。 参考ACdreamer巨巨的博客:http://blog.csdn.net/acdreamers/article/details/12259815代码#include <stdio.h>#include <str

2016-06-07 20:27:20 1390

原创 POJ 1273 Drainage Ditches (最大流)

题意求一个边小于200点小于200的图的最大流。思路因为这里点比较少,直接用Edmonds_Karp(BFS)求就可以了,复杂度为O(E2V)O(E^2V),bfs的复杂度是O(E),增广路的次数为V*E Ford-Fulkerson(DFS)的增广路次数为C,复杂度为O(E*C),不适用于这题。代码#include <stdio.h>#include <string.h>#include <

2016-06-07 20:14:48 373

原创 HDOJ 2457 DNA repair (AC自动机+DP)

题意给出一些子串和一个DNA串,求最少需要变换多少个字符可以让这个DNA不包含任意一个子串。思路dp[i][j]表示在字符串i处在trie图的节点j处时的最小改变数。 然后对字符串和每个节点都枚举递推一遍就行了。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <ve

2016-06-03 21:28:18 494

原创 POJ 3580 SuperMemo (Splay各种区间操作)

题意给出一个序列有6种操作 1.ADD x y D 2.REVERSE x y 3.REVOLVE x y T 4.INSERT x P 5.DELETE x 6.MIN x y x,y就是区间[x,y]思路Splay操作小合集。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorith

2016-06-03 12:38:32 647

原创 HDOJ 5411 CRB and Puzzle (矩阵快速幂)

题意给出一个邻接矩阵,求走k步以内所有的路径数量。思路离散数学里面学的嘛,可达矩阵的k次方就是走k步时的可达矩阵,然后就转化成计算A+A2...AmA+A^2...A^m 然后想到了POJ的那个经典题目,通过对m二分来求,然后疯狂TLE= =(一个log都不能多吗。。。 最后想到了以前做的某个AC自动机的题也是求这个,给原矩阵加一维然后求幂之后直接对那一维相加就可以了。代码#include <s

2016-05-31 16:33:42 466

原创 POJ 3420 Quad Tiling (瓷砖问题+矩阵快速幂)

题意有一个树,每条边都有权值,求每一个点出发的链的最大权值和。思路很经典的树形dp题目,和树的直径的性质相关。 从任意点出发能到达的最远的点一定是直径的一个端点,然后再从这个端点出发能到达的最远的点就是另一个断点,中间的边就是这个树的直径。 我们用两个dfs,第一次维护一个点到他的子树的最长路,第二次用来更新结果。比如u点的最长路,要么从他到他的子树叶节点,要么是从u到达根节点加上根节点到距离根

2016-05-31 16:26:01 746

原创 POJ 1155 TELE (树形背包)

题意1为根节点,有m个叶节点,其他为中间结点,每个结点的权值代表他愿意付出的钱,边的权值代表联通两节点的代价,求不亏损的情况下最多能到达多少个叶节点。思路另dp[u][i]表示根节点为u的子树此时装了i个叶节点的盈利情况(∑moneyi−∑Edgecosti\sum money_i - \sum Edgecost_i) 那么我们就能得到这样的状态转移方程: 如果u是叶节点dp[u][1]=1dp

2016-05-27 00:41:33 476

原创 HDOJ 2196 Computer (经典题)

题意有一个树,每条边都有权值,求每一个点出发的链的最大权值和。思路很经典的树形dp题目,和树的直径的性质相关。 从任意点出发能到达的最远的点一定是直径的一个端点,然后再从这个端点出发能到达的最远的点就是另一个断点,中间的边就是这个树的直径。 我们用两个dfs,第一次维护一个点到他的子树的最长路,第二次用来更新结果。比如u点的最长路,要么从他到他的子树叶节点,要么是从u到达根节点加上根节点到距离根

2016-05-26 20:24:14 422

原创 Codeforces 149D Coloring Brackets (不错的区间DP)

题意给出一个合法的括号序列,要求给这个序列染色,求染色方案。 1.可以选择无色、红色、蓝色。 2.每一对括号要有且仅有一个染色的括号。 3.相邻的括号不能有相同的颜色(无色没关系)思路显然是个区间DP,然后因为他的转移和相邻和相对的括号有关系,所以我们要对每一个区间保存一下当前区间端点的括号颜色,也就是dp[i][j][k][l]表示区间ij的端点颜色分别为k和j时此区间的染色种数。 不过这

2016-05-24 14:43:35 525

原创 ZOJ 3469 Food Delivery (区间DP)

题意一个外卖员要从x出发,送一条线上的n个人的外卖,每个人都有一个不满意度,这个会随着时间变化而增加,求送完所有人家外卖之后最低的不满意度。思路dp[l][r][0/1]表示送完了l和r这段区间之后,现在快递员待在l/r时这段区间的最小不满意度。 那么dp[i][j]都能够进行递推了,需要注意的是,因为时间是会累加的,但是如果递推到某个地方再计算的话时间无法统计,所以我们在计算每个区间的时候就加上

2016-05-24 14:21:57 476

原创 UESTC 594 我要长高 (单调队列优化DP)

题意给出一个序列,没两个之间差值乘C就是亏损的钱数,可以给一些数列以一定的代价变大,不能减小,求增加方案令最后的损失最小。思路令dp[i][j]表示第i个人身高为j时的当前损失。 我们能得到dp[i][j]=min(dp[i−1][k]+abs(j−k)∗C+(x[i]−j)∗(x[i]−j))dp[i][j]=min(dp[i-1][k] + abs(j-k)*C + (x[i]-j)*(x[i

2016-05-23 11:19:05 1046

原创 HDOJ 5255 魔法因子 (数学)

题意给出一个x,求有多少个长度小于等于10位的数,乘以x之后最高位和最低位互换其他不变。思路因为只有两位是动的其他不动,所以我们令高位为high,低位为low,中间位是mid,那么我们能得到 (high∗10len−1+mid+low)∗x=low∗10len−1+mid+high(high * 10 ^{len-1} + mid + low) * x = low * 10 ^ {len-1} +

2016-05-21 12:35:14 461

原创 HDOJ 3415 Max Sum of Max-K-sub-sequence(线段树优化DP)

题意给出一个环,求连续的k个数字中连续和最大是是多少,子串的开始下标和结束坐标是多少。思路第一次做这题的时候是在学单调队列的时候,单调队列的做法戳这里 这里我是直接dp搞,dp[i]=sum[i]−min(sum[j])i−k<=j<idp[i] = sum[i] - min(sum[j]) i - k <= j < i 显然直接做复杂度O(nk)是超时的,就用线段树维护一下min(sum[j

2016-05-20 21:14:49 401

原创 HDOJ 1430 魔板 (bfs+映射)

题意对于一个上面4个数下面4个数的魔板,可以如下操作: A: 上下两行互换 B: 每行循环右移一格 C: 中间4个方块顺时针旋转一格 给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的。思路在做之前我知道它是一个康拓展开的题,但是在我读题之后感觉直接bfs就可以了啊,一共8!个状态随便过啊= =,然后就超时了。。。 然后发现是我捉急了,这

2016-05-18 17:58:27 519

原创 POJ 2891 Strange Way to Express Integers (中国剩余定理)

题意求最小的x,满足x%m[i]=r[i]。思路裸的不互质的中国剩余定理(顺便夸一下这个CRT2的板子真的挺好用的=。=代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#includ

2016-05-17 15:50:20 390

原创 Codeforces 675D Tree Construction (splay)

题意往一个根为a[0]的二叉搜索树里面插数,每插一个数就输出他的父节点。思路根据二叉搜索树的性质,我们插进去一个数,他的父节点肯定是比他小的最大的和比他大的最小的数里面的两个,然后这两个节点找最深的那个就是他的父节点,我们可以给这些节点设置一个时间戳就能判断先后顺序了。 在找那两个节点的时候我是直接用的splay找的,实际上我们可以直接用两个set一个储存负数一个储存正数然后两个lower_bou

2016-05-17 14:49:15 767

原创 Codeforces 675C Money Transfers (扫描)

题意每个银行都有都有一个需求,有的是正数有的是负数。 要求到最后通过数字转移全部银行都变成0,求最小移动步数。思路首先把他看成一个环来考虑,每次转移都要经过全部的有需求的银行,那么显然我们可以找到一个不用走的区间也就是中间全部为0的区间,让这个区间的结尾作为转移资金的开头,循环一遍到这个区间的开头。 预处理一下前缀和,然后再枚举一遍找到最大就可以了。代码#include <stdio.h>#i

2016-05-17 14:35:49 776

原创 HDOJ 1573 X问题 (余数不互质的中国剩余定理)

题意求n以内有多少个数满足x%a[i]=b[i]。思路能发现我们可以用不互质的中国剩余定理求出来最小的x,然后(n-x)/lcm+1求个数 然后我就WA了好几发。。。注意求出的x为0且不是无解的时候最后的个数是(n-x)/lcm。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#in

2016-05-16 23:15:12 587

原创 POJ 1006 Biorhythms (中国剩余定理)

题意人的身体智力和情感都有高峰低估期,给出这三个的起始天和现在的天数,求还需要多少天能达到三个高峰。思路令这个起始天为a, b, c,那么达到的天数就是ans。 ans % 23 = a; ans % 28 = b; ans % 33 = c 解这个就可以了。因为数据比较少(为了巩固一下计算方法,就直接在函数里面计算了。代码#include <stdio.h>#include <string.

2016-05-16 21:01:04 406

原创 Codeforces 672D Robin Hood (二分)

题意有一个数列,有k天,每天可以让最大值减一最小值加一,求k天后最大值和最小值的差值。思路刚开始一直想着用什么东西维护一下,其实这个应该算是个模拟吧。 因为是把大的加到小的上面,所以我们只要看一下这个k最多能给最小值提高到多少,最多能给最大值减少到多少。 我们可以二分这两个值(找好上下界也就是最大值不能再分的时候),或者直接扫两遍也是支持的。代码#include <stdio.h>#inclu

2016-05-13 01:25:58 526

架构整洁之道

《架构整洁之道》是创造“Clean神话”的Bob大叔在架构领域的登峰之作,围绕“架构整洁”这一重要导向,系统地剖析其缘起、内涵及应用场景,涵盖软件研发完整过程及所有核心架构模式。《架构整洁之道》分为6部分,第1部分纲领性地提出软件架构设计的终极目标,描述软件架构设计的重点与模式;第2~4部分从软件开发中三个基础编程范式的定义和特征出发,进一步描述函数、组件、服务设计与实现的定律,以及它们是如何有效构建软件系统的整体架构的;第5部分从整洁架构的定义开始,详细阐述软件架构设计过程中涉及的方方面面,包括划分内部组件边界、应用常见设计模式、避开错误、降低成本、处理特殊情况等,并以实战案例将内容有机整合起来;第6部分讲述具体实现细节。

2018-11-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除