技巧
文章平均质量分 59
yzyyylx
这个作者很懒,什么都没留下…
展开
-
二维前缀和
解释 二维前缀和用于计算在矩阵中的任意一个矩形中数字之和,若仅用两个for将其中的所有元素相加,处理所有矩形必然超时,正确做法的复杂度为O(m*n).方法 首先预处理处以所有点为右下角,(1,1)为左上角的矩阵中的元素和. 接着(x1,y1)为右下角,(x2,y2)为左上角的矩形中的元素和为f[x1][y1]+f[x2-1][y2-1]-f[x1][y2-1]-f[x2-1][y1]原创 2017-10-20 18:35:51 · 9241 阅读 · 0 评论 -
POJ 2449 Remmarguts' Date(k短路)
题面题意 给出一幅有向图,求出其中的第k短路方法 首先应该想到用BFS加上优先队列,按照距离由短到长进行搜索,当到达终点次数达到k次时停止.代码(错误)#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define ll long long#define P pair<ll,ll>#defin原创 2017-11-07 20:06:07 · 246 阅读 · 0 评论 -
Social Net ZOJ - 3649
题意给出一幅有n个点的连通图,求出它的最大生成树,之后对于m个询问,每个询问包括两个数ab,求出a到b的路径上的极差最大值(必须用后面的数来减前面的)方法首先求出最大生成树,之后找到LCA,即可由它得到路径,但是发现暴力扫整一条路径肯定会TLE,因而可以用倍增的方法来预处理 dad[i][j]表示i节点的第(1 &lt;&lt; j)的父节点(即父节点的父节点的父节点,重复(1&lt...原创 2017-10-30 12:56:53 · 330 阅读 · 0 评论 -
lightoj 1424 - New Land
题面题意 在一个01矩阵中找出最大的全为0的子矩阵。方法 首先预处理出每一个点从左到右连续0的个数,然后一列一列比较,找出以每一列为子矩形最后一列的最优结果(每一列的处理方法详见Histogram LightOJ - 1083),之后不断更新答案即可。 关键在于将此二维问题转化为一维的。代码#include<bits/stdc++.h>#define N 2010using原创 2017-10-24 22:38:17 · 348 阅读 · 0 评论 -
笛卡尔树
性质二叉树,其中的每一个点是整棵树的极值,且每一棵树的中序遍历是原数组的一段。 详见下图: 建树方法每次加入到树的最右节点,若不符合其规范,沿着右边那一条链向上找,将它插入到恰好符合的那一个点的左节点,并且将那一段不符合的点加入到新加入点的右子树,并且更新右边那一条链。 例题代码scanf("%d",&amp;n); for(i=1;i&lt;=n;i...原创 2017-10-23 20:35:38 · 523 阅读 · 0 评论 -
hdu4374 One hundred layer(单调队列维护dp)
题面题意 给出宽n,长m的矩阵,你一开始在第一行第k个,在每行你最多向左或向右移动t步(在底层和顶层皆可移动),移动后进入下一层,问到达底层后的最大分数是多少.方法 用dp思想可知,只需要知道到达每一点的最大得分是多少,若穷举每行的起点和终点进行状态转移,复杂度为O(n*m^2)必然TLE. 其实在第i行若终点为j,则起点必然在max(1,j-t)与min(m,j+t)之间,对于此类原创 2017-10-25 19:26:41 · 263 阅读 · 0 评论 -
LightOJ 1128 Greatest Parent
题面题意 给出一棵树,每个点都有一个权,每次查询一个点的祖先中比某个数大的最大深度. 已知父节点的权绝对严格小于其子节点方法 建树之后,利用倍增进行与二分类似的思想进行查找,fa[i][j]记录点i向上(1 << j)代的父亲. 每次查找都找不超过当前范围的最大祖宗.代码#include<bits/stdc++.h>#define N 500100using namesp原创 2017-10-30 19:17:54 · 258 阅读 · 0 评论 -
light oj 1017 - Brush (III) (dp)
题面题意 有n个点,每一次用刷子刷的时候,可以将w行与x轴平行的点清除,问在k次内最多可以清除几个点.方法 方法此题的难点就在于如何转移状态,若用纵坐标来,则爆数组,故应该抓住只有n<=100个点,因为一定存在一个最优解中没有两次刷有相交部分,且每次刷的最下面一个点至少有一个点. 因此以最下面的其中一个点来表示怎么刷,并以dp[i][j]表示当前考虑到的最上面的一刷是i,还剩下j次.原创 2017-10-22 19:32:32 · 152 阅读 · 0 评论 -
插头dp
题面题意 给出m*n的矩形,问用1 *2的小矩形填满共有几种方法。方法 此题首先可以逐行递推,枚举两行可以转移的状态,详见状压dp解法,还可以用插头dp的方法,逐个格子递推,具体见图: 蓝色表示当前考虑的格子,红色表示此时记录的状态,本质上就是一个格子一个格子覆盖过去,若已经覆盖则直接转移到下一个状态,反之则覆盖上能盖的并更新状态。代码#include<iostream>原创 2017-11-08 22:21:26 · 284 阅读 · 2 评论 -
poj 2442 Sequence(堆)
题面题意 给出一个m*n的矩阵,每行选择一个数相加,问所得的n个最小值是多少。方法 将所有数一起处理必然会有漏洞,无法保证答案的正确或是时间,故可以一行一行处理,因为多考虑一行后的n个最小数必然由考虑这一行之前的n个最小值与这一行上的一些数相加得到,因而每次只需记录考虑上面几行后的最小值即可,问题就转换为了求两行上一些数相加的所有和中的最小的n个值。 这个问题可以用堆解决,因为两个序原创 2017-11-08 23:22:11 · 257 阅读 · 0 评论 -
lightoj 1018 - Brush (IV) 【状压dp】
题面题意 给一些点,问最少可以用几条直线将他们全部覆盖.方法 因为n&lt;=16,故方法为状压dp 首先预处理出任意两条直线所能覆盖的点,之后枚举来更新状态枚举方法 首先枚举状态(基本规律,这样效率更高),然后添加直线的一个端点为该状态下第一个未覆盖的点,枚举另外一个,并用这两点组成的直线来更新状态,这样复杂度仅为O(n*2^n) 若不先枚举状态,先枚举其中一个点,则无法利用原创 2017-10-23 17:23:20 · 306 阅读 · 0 评论 -
Solutions to an Equation LightOJ - 1306
题面题意 Ax + By + C = 0,给出A,B,C和x1,x2,y1,y2,其中x1<=x<=x2且y1<=y<=y2,那么该方程一共有几组整数解方法欧扩 一开始先特判a,b中有0的情况 难点之一在于a,b可以为负数,故在进行一系列操作之前先将符号存起来,因为符号不影响数值的绝对值大小,为了更加方便,可以先算出一组解的绝对值,再枚举4种符号匹配方式,找到使等式成立的哪一种情况.原创 2017-10-31 18:00:23 · 360 阅读 · 0 评论 -
Closest Distance LightOJ - 1146
题面题意 有两个人分别从a到b,从c到d匀速行走,且同时出发,同时到达,问两人在行走过程中的最短距离是多少.方法 因为距离的函数图像为有峰点的二次函数,顾可以用三分法来做. 由两人匀速且同时出发,同时到达可得,两人在等比例地行走.故可以通过精确两人的位置来求最短距离代码#include<bits/stdc++.h>#define db doubleusing namespace原创 2017-11-01 07:40:41 · 293 阅读 · 0 评论 -
POJ2891 Strange Way to Express Integers
题面题意 给出n对数,每对数为k1,r1,已知m%k1=r1,求m.方法欧扩 在输入时,不断改变m的值使它符合条件,为使m也符合之前的条件,故只能加前面所有k的最小公倍数,顾可得如下方程: ki*x+ri=m(之前)+gcd(k[i-1]……..k[1]) *y. 移项后得ki*x-gcd(….) *y=m-ri. 此方程可用欧扩来解代码#include<iostrea原创 2017-11-01 07:48:45 · 289 阅读 · 0 评论 -
lightoj 1071 - Baker Vai
题面题意 有一矩阵,每一个点上都有一个数,先从左上角出发到右下角再回来(只能向下或向右,回来时只能向上或向左),出两个除了两个角之外,每一个点只能经过一次,问最后的路径上数之和最大为多少.分析 此难于无法记录状态 因为数据范围为100,故不可能用状压,继续深入发现只需知道他达到某一个点的最大值为多少,而无需直到他怎么走.方法 将过去回来两次当作两个人同时走,且两人不能相遇,故两原创 2017-10-24 18:04:59 · 308 阅读 · 0 评论 -
LightOJ 1060 - nth Permutation
题面题意 给出一个字符串,和整数n,输出这个字符串的第n个全排列.方法 考虑到由小写字母组成,共26个,可求出每一种字符的个数 一个字符一个字符来求,枚举当前位,用组合数求出此时后面排列的种类数,若比n大,再找下一位,反之,枚举下一位,若枚举完了仍没有符合条件的,则不可能代码#include<bits/stdc++.h>#define ll long longusing nam原创 2017-10-25 09:53:29 · 269 阅读 · 0 评论 -
1010 - Knights in Chessboard
题面题意 给出一个m*n的棋盘,问最多能放几个不相互攻击的马(马在格子里且没有马脚)。方法 经过观察,可以发现马每跳一次的之后横纵坐标之积的奇偶性都会发生改变,故可以将所有白色格子或黑色格子放满马。 注意一下特殊情况: 1.有一边为1,可以放满 2.有一边为2,放一个田再隔一个田。代码#include<bits/stdc++.h>using namespace std原创 2017-11-01 23:38:12 · 211 阅读 · 0 评论 -
POJ1742 Coins(多重背包可行性)
题面题意 给出n种硬币和数量,问它能组成多少种小于等于m的币值.方法 首先暴力必然TLE,而对于多重背包可以用二进制优化,现有另外一种做法: 不难想到可以用一个数组记录一种币值是否可以凑到,而我们可以修改一下这个数组的定义,-1表示目前还无法凑到,若大于等于0则表示可以凑到且当前考虑的这种币值还有这么多个,若大于1则可以继续更新当前币值加现在的数.代码#include<iostre原创 2017-11-02 07:55:48 · 276 阅读 · 0 评论 -
HDU 4474 Yet Another Multiple Problem
题面题意 题意,给出n和m个数,问是否存在一个n的倍数不包含这m个数,如果有则输出最小的,反之输出-1.方法 BFS,按长度一位一位枚举,首先枚举0~9(能用的数)若还没有数与它除以n同余,就将记录在下标为该余数的数组中,并入队,反之不记录,因为如果存在一个比他先记录下来的数和它同余,那么一定较小且在后续操作中利用价值更高. 每次从队首取出元素,并在它后面加上一个数,若组成的新数除以原创 2017-11-02 17:49:50 · 226 阅读 · 0 评论 -
Find The Multiple(POJ_1426)
题面题意给出一个n,输出n的倍数中一个仅有0和1构成的数,n<=200.法1 打表将长度在11及以内的01串打下来,并特判几个不在这个长度内的数 也可以直接打印200个数的答案表 非最优方法,但也是个解题技巧代码#include<iostream>#include<cstdio>#define ll long longus...原创 2017-11-02 20:46:46 · 2299 阅读 · 0 评论 -
hdu1010(dfs+剪枝)
题面题意 给出一个迷宫,从S到D,X是墙,并给出一个时间T,问能否恰好在T时到达D点,不能重复走方法 DFS+剪枝 因为走过的点不能再走,且不是最短路,故不能用BFS,而DFS的回溯能解决此问题,故用深搜. 直接搜索显然不行,必须要加以下剪枝: 预处理时: 1.非x点不到t+1个,直接输出No 2.由奇偶来看,起点走t步后与终点的奇偶性不同,直接No 搜索时原创 2017-11-03 08:24:48 · 240 阅读 · 0 评论 -
快读(快速读入)
解释因为getchar()比scanf要快,故为了加快读入,可以用getchar()代替scanf.思路利用getchar()将数字读入,若为” “或”\n”结束,第一个字符判断一下数字的正负,然后每读入一个数字就将当前数*10并加上它代码1.inline int read() { char ch = getchar(); int x = 0, f = 1; ...原创 2017-10-20 18:48:14 · 19064 阅读 · 1 评论 -
codeforces 891B - Gluttony
题面题意 给出一个长度为n且无相同整数的序列,求该序列的一个排列使两序列中任意几个(大于0小于n)位置的数之和不相同.方法 开始看到n<=22以为用状压,但无论是时间还是空间都很紧张,且n的范围纯属是因为评测时判断正确与否的复杂度为2^n. 正确方法是时除了最小数外,其他数都变成比它在序列中小一点的数,最小数变成最大数.证明 假设不取最小值,那么和一定要比原来的序列小,因而不取原创 2017-11-18 20:27:56 · 352 阅读 · 0 评论 -
POJ 1475 Pushing Boxes
题面题意 给出一副只有一个箱子的地图,输出路径.没有则输出”Impossible.” 路径要保证箱子移动次数最小,在此条件下,人移动次数最小.方法 因为求最小次数,故用BFS 因为考虑到要箱子移动次优先,而不是人,故直接搜人怎么移动必然会出错 因而我们可以给每次移动加一个权,人移动的代价是1,箱子是1000,并将结果存储在一个优先队列中,这样就能保证箱子移动次数最少,再用原创 2017-11-06 17:43:08 · 347 阅读 · 0 评论 -
洛谷 P3630 [APIO2010]信号覆盖
题面题意 给出n个点(没有三点共线),取三个点做它们的外接圆,问所有取法中覆盖的点的平均个数是多少.方法 考虑每一个四边形对答案的贡献值(除了取的三个点外的覆盖点),每个凹四边形的贡献值为1,因为只有取最外面的三点才能多覆盖一个,而凸四边形的贡献值为2,因为有一对对角之和小于180,另一对对角大于180. 之后问题就被转化为了求所有组成的四边形的凹四边形的个数. 求凹四边形原创 2018-01-12 18:50:40 · 264 阅读 · 0 评论 -
洛谷 P2476 [SCOI2008]着色方案
题面题意 有n个木块,用k种颜色染色,每种油漆够染a[i]个,且a[i]之和为n,那么相邻两木块互不相同的染色方法有几种.方法 此题难于记录状态,若用状态压缩则空间明显不够. 抓住每种颜色最多够刷5个木块且不一定要知道每一种颜色还剩下几个,可以开六位数组记录,前五个中,第i个记录剩余够刷i个木块的数量,最后一位记录上次用的颜色现在还够刷几个. 注意状态转移时,够刷i个的 -1原创 2018-01-12 19:43:14 · 274 阅读 · 0 评论 -
codeforces 913C Party Lemonade
题面题意有n种购买方法,每种购买方法是买(1 << i)个花a[i]的钱,你要买至少m个,输出最小花费.分析首先想到的就是dp,dp[i]表示买i个所需要的最少金钱,但因m,n<=1e9而放弃. 这题的做法是贪心,首先算出(1 << i)个物品所需要的最少钱币,用较小的购买方法去更新,之后将其转化为二进制,每一位均用之前处理出来的数去更新. 但...原创 2018-01-09 20:53:02 · 586 阅读 · 0 评论 -
CodeForces 913 E. Logical Expression
题面题意 给出x=1111B,y=110011B,z=1010101B,输出一个由x,y,z组成的字符串使其结果为给出的数,且最短,若长度相同,则输出字典序最小的一个.方法 首先按符号的优先级来划分等级: 0 – (),! 1 – & 2 – | dp[i][j]表示优先级为i,值为j时的最优表达式. 因此,dp[0][x]=x,dp[0][y]=y,dp[0原创 2018-01-10 15:17:06 · 446 阅读 · 0 评论 -
洛谷 P1608 路径统计
题面题意 给出一幅有向图,问从1到n的最短路共有几条,无法到达则输出”No answer”.方法 首先求出从起点开始到各个点的最短路,之后可以将多余的边去掉(最短路不需要的,也就是到该点最短距离+边>边上的另一个点),那就会形成一个有向无环图且无论怎么走都会到达终点且都是最短路,按照最短距离有小到大更新其他点的最短路的条数即可. 注意两点: 1.记得去掉重边 2.不可用暴原创 2018-01-10 20:16:17 · 298 阅读 · 0 评论 -
CodeForces - 337D D. Book of Evil
题面题意 给出一棵树,其中有且只有一个节点上有魔鬼,与它距离在d以内的点都有可能收到影响,先给你这些收到影响的点,问几个节点上可能有魔鬼做法 首先可以证明:如果有一点到这些点中的最远的两点的距离均小于等于d,则这点上可能会有鬼. 之后问题就转化为了找收到影响的点中的最远两点. 又可以证明:以任意一点为根,两点中一定有一个点的深度最大. 因此可以先以1为根,dfs,找到此时原创 2018-02-10 19:59:11 · 213 阅读 · 0 评论 -
C. Ilya And The Tree codeforces 842 C
题面题意 有一棵树,一开始每个点有一个初始值,每一个点的新数为它到树顶的路径中的所有数,去掉一个数后的最大公因数中的最大值.做法 因为要去掉一个数,所以一个个枚举显然不显示,因而可以在dfs时记录一下此时的点到根的数的因数个数,也就是每扫到一个点都将其分解质因数(记得回溯),若新增的因数的个数达到其深度-1,则这个数可用,在分解的同时找到最大的. 但还要考虑不是新增的因数,即去掉的数原创 2018-02-10 21:07:21 · 178 阅读 · 0 评论 -
洛谷 P2765 魔术球问题
题面题意有n个柱子,编号为1,2…….的小环,要将它们依次套在环上,要求直接接触的两小球的和为完全平方数,那么最多可以套几个小球。做法首先可以贪心,如果可以套在其他小球上,则套在其他小球上,反之,套在柱子上,直到没有多余柱子,可以证明这是对的,但我觉得还是网络流的做法比较重要。 因为要依次取小球,那么当答案为ans时,编号为1-ans的小球都被取走,我们可以用类似于洛谷 P1251 餐巾计划问题的原创 2018-03-12 23:49:25 · 298 阅读 · 0 评论 -
洛谷 P4092 [HEOI2016/TJOI2016]树
题面题意给出一棵树,两种操作,给节点打标记(1为根,初始仅1打了标记),询问祖先中距离他最近的打了标记的节点做法这题可以用暴力水过去,也可以用树链剖分来做. 但利用并查集可以十分巧妙地解决这题. 首先可以发现随着询问的进行,每点的答案将会被分成越来越多块,而倒过来进行的话则会发现块数将会越来越少直到最后的一块,且每次都是两块并成一块,因此我们可以记录下操作后用并查集维护,若一个点打了标记,则其父原创 2018-03-30 16:49:16 · 332 阅读 · 0 评论 -
SPOJ - LCS2 - Longest Common Substring II
题面题意给出最多十个字符串,求它们的最长公共子串.做法大致思路是对第一个字符串建出后缀自动机后,每个字符串都去匹配,对于自动机上每一个节点都用一个临时数组求出它所能匹配到的最长后缀长度,每个字符串匹配完后临时数组与上一次匹配后的结束状态取一个最小值. 一开始TLE了一次,WA了一次. TLE那次我更新临时数组上的某个点时,沿着它的fail向上更新了所有点,这样对于极限数据将会退化成O(n^2),原创 2018-03-31 19:06:25 · 215 阅读 · 0 评论 -
洛谷 P2371 [国家集训队]墨墨的等式
题面题意给出n个数,每个数可以选无数次,现在问l与r之间有多少数可以作为选取数之和。做法因为数据范围很大,所以根本不能一个一个去更新,但可以从余数的角度去考虑。 我们令这些数中最小的数为t,p为小于t的非负整数,则若k*t+p可以被取到,那么对于所有的k2>=k,k2 *t+p也可以被取到,因此我们只要找到所有最小的能够被取到的k *t+p即可算出答案。 这可以用最短路来做,对于0~t-1的所有原创 2018-04-01 09:02:16 · 646 阅读 · 0 评论 -
洛谷 P2048 [NOI2010]超级钢琴
题面题意给出一个序列,求和最大的k个连续子序列的和,且连续子序列长度在l与r之间.做法首先预处理出前缀和,我们可以从左端点开始考虑,若左端点为i,则右端点在i+l-1与i+r-1之间,那么可以计算出这些区间的最大值,然后放到堆里去,每次从堆中取出最大值加到ans中后再将该区间左右两区间的最大值放入堆中. 也就是说我们维护一个结构体(i,l,r,mx)表示左端点为i,右端点在l,r之间的,且这些区间原创 2018-03-16 20:05:40 · 364 阅读 · 0 评论 -
股神小L 2016Vijos省选集训 day1
题面小L厌倦了算法竞赛,希望到股市里一展身手。他凭借自己还行的计算机功底和可以的智商,成功建立一个模型预测了一支股票接下来n天的价格。我们把这支股票第i天的价格称为a_i。在接下来n天里,每一天小L可以选择花费a_i买入一股或者卖出一股从而获得a_i元收入。 当然小L卖出股票的时候,自己的账户上必须要有至少一股的剩余。现在小L希望知道,在n天过去之后,采取最优策略的情况下自己最多赚到多少钱。注意小原创 2018-04-03 13:25:54 · 565 阅读 · 1 评论 -
洛谷 P2153 [SDOI2009]晨跑
题面题意 给出一幅有向无环图,问从点1到点n有几条互相没有交点(除起点终点外不能有公共点)的路径,保证路径数量最多的情况下,路径最大数量与最短的路径长度之和是多少.分析 与费用流裸题不同的是,不能有公共点,解决方法是将每一个点拆为一个入点和一个出点,流量为1(起点终点不用拆或者流量为INF),建边时,从一个点的出点连向另外一点的入点,再跑一遍费用流即可.代码#include<iostre原创 2018-02-06 15:40:14 · 235 阅读 · 0 评论 -
洛谷 P2517 [HAOI2010]订货
题面题意 给出每一个月的商品需求量和每一个月的生产成本以及仓库容量和贮存费用(每月,与贮存货物的量无关),问最小成本.分析 一开始没有想到用费用流去做,且难以建图,但将名词转化一下即可 将货物的量当做流量,成本当做费用,先建一个超级源点(可以理解为工厂),连向每一个月的节点,因为生产数量无限制,故流量为INF,费用为成本,再建一个超级汇点(理解为客户),每一个月的节点连向它,流量为需原创 2018-02-06 16:39:09 · 214 阅读 · 0 评论 -
bzoj 2324: [ZJOI2011]营救皮卡丘
题面题意 有k个人从0点开始走,他们分开行动,要依此经过所有点,则最短距离是多少.做法 与洛谷 P1251 餐巾计划问题的做法相似. 首先所有点都必须要经过,因此我们可以看做一个人第一次到达i点时,直接到达超级汇点,又从超级源点流出到达i点,这样可以保证每个点都被经过,可以将每个点拆成两个,一个与汇点相连,一个与源点相连,流量均为1,费用为0. 为了保证依次经过,在弗洛伊德时,原创 2018-02-26 16:25:48 · 193 阅读 · 0 评论