
经典
文章平均质量分 63
yzyyylx
这个作者很懒,什么都没留下…
展开
-
Tian Ji -- The Horse Racing HDU - 1052 (贪心,dp)
题面题意 给出长度为n的两串序列,两两匹配,第一串中的大得200分,小扣200分,平局,不得分,输出最大分数方法 如果仅用单一的贪心: 平局时,出最大的数: 反例如下 2 1 3 2 3 答案是0,但用贪心将输出-200 平局时出最小的数: 反例如下 3 1 2 3 1 2 3 正确答案是200,但却会输出0原创 2017-10-18 18:17:01 · 257 阅读 · 0 评论 -
LightOJ 1061(n皇后)
题面题意 给出一个图,图中有8个皇后,问至少移动几步才能使它满足八皇后.方法 首先枚举八皇后问题的92种解法,算出给出图与正确图间的最小移动步数并以此更新答案 计算步数的方法:用状态dp进行两两匹配,算出两点间的最少移动次数(皇后要移动几步,移动时可无视其他皇后). 若在移动时遇到其他皇后,则可通过交换移动次序来避免此情况.代码#include<bits/stdc++.h>原创 2017-10-25 21:02:06 · 399 阅读 · 0 评论 -
SGU - 199(最长不下降子序列)
题面题意 输入n对数,选择尽可能多对,使任意两对中其中一对的两数比另外一对.思路 按第一个数的大小排列,找出另外一个数的最长不下降子序列错误方法(TLE) 用dp思想,仅讨论当前数选择或不选择,选择结果,之前比它小的数的结果+1. 复杂度为O(nlogn)代码#include<bits/stdc++.h>#define N 100100using namespace st原创 2017-10-19 19:27:18 · 590 阅读 · 0 评论 -
二维前缀和
解释 二维前缀和用于计算在矩阵中的任意一个矩形中数字之和,若仅用两个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 · 9403 阅读 · 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 · 259 阅读 · 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 · 281 阅读 · 0 评论 -
HDU 3530 Subsequence
题面题意 多组数据 给n,k,m和n个数,问这n个数中最长满足其中最大值与最小值之差在m与k之间的子串的长度. n<=100000方法 因为n的范围和多组数据,必须用O(n)算法. 用单调队列来维护最大值和最小值,并据此dp 该单调队列使用时,将加入元素与队尾比较,根据维护的极值来判断比较规则,使队首表示的是该队列上一个pop的元素的位置右端到目前推入的元素的极原创 2017-10-24 20:20:30 · 267 阅读 · 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 · 274 阅读 · 0 评论 -
插头dp
题面题意 给出m*n的矩形,问用1 *2的小矩形填满共有几种方法。方法 此题首先可以逐行递推,枚举两行可以转移的状态,详见状压dp解法,还可以用插头dp的方法,逐个格子递推,具体见图: 蓝色表示当前考虑的格子,红色表示此时记录的状态,本质上就是一个格子一个格子覆盖过去,若已经覆盖则直接转移到下一个状态,反之则覆盖上能盖的并更新状态。代码#include<iostream>原创 2017-11-08 22:21:26 · 304 阅读 · 2 评论 -
poj 2442 Sequence(堆)
题面题意 给出一个m*n的矩阵,每行选择一个数相加,问所得的n个最小值是多少。方法 将所有数一起处理必然会有漏洞,无法保证答案的正确或是时间,故可以一行一行处理,因为多考虑一行后的n个最小数必然由考虑这一行之前的n个最小值与这一行上的一些数相加得到,因而每次只需记录考虑上面几行后的最小值即可,问题就转换为了求两行上一些数相加的所有和中的最小的n个值。 这个问题可以用堆解决,因为两个序原创 2017-11-08 23:22:11 · 278 阅读 · 0 评论 -
lightoj 1018 - Brush (IV) 【状压dp】
题面题意 给一些点,问最少可以用几条直线将他们全部覆盖.方法 因为n&lt;=16,故方法为状压dp 首先预处理出任意两条直线所能覆盖的点,之后枚举来更新状态枚举方法 首先枚举状态(基本规律,这样效率更高),然后添加直线的一个端点为该状态下第一个未覆盖的点,枚举另外一个,并用这两点组成的直线来更新状态,这样复杂度仅为O(n*2^n) 若不先枚举状态,先枚举其中一个点,则无法利用原创 2017-10-23 17:23:20 · 326 阅读 · 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 · 379 阅读 · 0 评论 -
Closest Distance LightOJ - 1146
题面题意 有两个人分别从a到b,从c到d匀速行走,且同时出发,同时到达,问两人在行走过程中的最短距离是多少.方法 因为距离的函数图像为有峰点的二次函数,顾可以用三分法来做. 由两人匀速且同时出发,同时到达可得,两人在等比例地行走.故可以通过精确两人的位置来求最短距离代码#include<bits/stdc++.h>#define db doubleusing namespace原创 2017-11-01 07:40:41 · 314 阅读 · 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 · 316 阅读 · 0 评论 -
lightoj 1025 The Specials Menu (dp)
题面题意 给出一个,可以去掉若干个字符,使它变为回文串的方法有几种.方法 可以发现,任何一种操作都可以通过不断进行以下三种得到: 1.去掉第一个.dp[i][j]+=dp[i+1][j] 2.去掉最后一个.dp[i][j]+=dp[i][j-1] 3.两边都不去掉(在两端相同的情况下)dp[i][j]+=dp[i+1][j-1] 注意,一二操作同时进行时有重叠部分(原创 2017-10-23 15:59:32 · 230 阅读 · 0 评论 -
lightoj 1071 - Baker Vai
题面题意 有一矩阵,每一个点上都有一个数,先从左上角出发到右下角再回来(只能向下或向右,回来时只能向上或向左),出两个除了两个角之外,每一个点只能经过一次,问最后的路径上数之和最大为多少.分析 此难于无法记录状态 因为数据范围为100,故不可能用状压,继续深入发现只需知道他达到某一个点的最大值为多少,而无需直到他怎么走.方法 将过去回来两次当作两个人同时走,且两人不能相遇,故两原创 2017-10-24 18:04:59 · 336 阅读 · 0 评论 -
POJ1742 Coins(多重背包可行性)
题面题意 给出n种硬币和数量,问它能组成多少种小于等于m的币值.方法 首先暴力必然TLE,而对于多重背包可以用二进制优化,现有另外一种做法: 不难想到可以用一个数组记录一种币值是否可以凑到,而我们可以修改一下这个数组的定义,-1表示目前还无法凑到,若大于等于0则表示可以凑到且当前考虑的这种币值还有这么多个,若大于1则可以继续更新当前币值加现在的数.代码#include<iostre原创 2017-11-02 07:55:48 · 296 阅读 · 0 评论 -
POJ - 2411 (状压dp)
题面题意 输出用1*2的矩形填满m *n的矩形的方法数方法 状态压缩,用二进制数表示每一层,枚举当这一层上面全部被填满后该状态的种类数,并且预先处理好上一层为哪些状态时,可以转化为这一层,其中限定每一层只有横着放和竖着(穿过这一层和上一层)两种方法,故若两层对比时,两边的同一格都未放则无法转化,若两层的同一个都放了的这些位置的长度为奇数时,也不行. 最后每行枚举上一行可以的状态,并相原创 2017-10-16 19:04:55 · 448 阅读 · 0 评论 -
HDU 4474 Yet Another Multiple Problem
题面题意 题意,给出n和m个数,问是否存在一个n的倍数不包含这m个数,如果有则输出最小的,反之输出-1.方法 BFS,按长度一位一位枚举,首先枚举0~9(能用的数)若还没有数与它除以n同余,就将记录在下标为该余数的数组中,并入队,反之不记录,因为如果存在一个比他先记录下来的数和它同余,那么一定较小且在后续操作中利用价值更高. 每次从队首取出元素,并在它后面加上一个数,若组成的新数除以原创 2017-11-02 17:49:50 · 249 阅读 · 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 · 2435 阅读 · 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 · 260 阅读 · 0 评论 -
八数码 HDU - 1043(状态压缩,宽搜)
题面题意 3*3的方格中有一个x,可以将x与它相邻的方块交换,使最终结果为 1 2 3 4 5 6 7 8 x方法 用康拓展开式的方法,状压(也可以采用哈希表),然后通过不断的转换实现用1~362880(9!)来记录3*3中数字的状态 记录时,用9来代替x 再进行宽搜(从最终状态开始),用一个数组来记录达到各个状态之前的状态,并用另一个数组记录这次的移动代码原创 2017-10-18 18:01:58 · 562 阅读 · 0 评论 -
POJ 1475 Pushing Boxes
题面题意 给出一副只有一个箱子的地图,输出路径.没有则输出”Impossible.” 路径要保证箱子移动次数最小,在此条件下,人移动次数最小.方法 因为求最小次数,故用BFS 因为考虑到要箱子移动次优先,而不是人,故直接搜人怎么移动必然会出错 因而我们可以给每次移动加一个权,人移动的代价是1,箱子是1000,并将结果存储在一个优先队列中,这样就能保证箱子移动次数最少,再用原创 2017-11-06 17:43:08 · 369 阅读 · 0 评论 -
洛谷 P2533 [AHOI2012]信号塔 (最小圆覆盖)
题面题意 给出n个点,输出最小覆盖圆的坐标和半径做法 首先用random_shuffle随机化点的顺序,然后做以下操作: 1.枚举所有点(设为i从2到n),若有点在当前圆外(一开始的圆为第一个点,半径为0),则将圆心变为这个点,半径改为0,进入2. 2.枚举已经考虑过的点(设为j从1到i-1),若有点在当前圆外,将圆心变为i,j两点的中点,半径为两点距离的一半. 3.枚举原创 2018-01-12 10:19:16 · 459 阅读 · 0 评论 -
洛谷 P3630 [APIO2010]信号覆盖
题面题意 给出n个点(没有三点共线),取三个点做它们的外接圆,问所有取法中覆盖的点的平均个数是多少.方法 考虑每一个四边形对答案的贡献值(除了取的三个点外的覆盖点),每个凹四边形的贡献值为1,因为只有取最外面的三点才能多覆盖一个,而凸四边形的贡献值为2,因为有一对对角之和小于180,另一对对角大于180. 之后问题就被转化为了求所有组成的四边形的凹四边形的个数. 求凹四边形原创 2018-01-12 18:50:40 · 300 阅读 · 0 评论 -
洛谷 P2476 [SCOI2008]着色方案
题面题意 有n个木块,用k种颜色染色,每种油漆够染a[i]个,且a[i]之和为n,那么相邻两木块互不相同的染色方法有几种.方法 此题难于记录状态,若用状态压缩则空间明显不够. 抓住每种颜色最多够刷5个木块且不一定要知道每一种颜色还剩下几个,可以开六位数组记录,前五个中,第i个记录剩余够刷i个木块的数量,最后一位记录上次用的颜色现在还够刷几个. 注意状态转移时,够刷i个的 -1原创 2018-01-12 19:43:14 · 298 阅读 · 0 评论 -
洛谷 P1325 雷达安装
题面题意 x轴上方上给出n个点,在x轴上至少要做几个半径为r的圆使它们全部被覆盖.方法 首先先算出每个点要被覆盖所需要的圆的圆心范围,这样问题就转化为了在n个区间中至少取几个点,使每一个区间中都有至少一个点. 方法是贪心,一开始的写法是根据左端点排序,每次若该区间中无点,则取当前的右端点为新的圆心,但因为无法保证右端点一定被覆盖,因而贪心错误.hack数据:2个区间,(1,4),(2原创 2018-01-15 18:45:06 · 259 阅读 · 0 评论 -
洛谷 P1651 塔
题面题意 给出n(n<=50)个数(每个数<=500000),选择其中一些并分成两组,使得两组的和相等问这个和最大是多少.做法 dp,dp[i][j]表示考虑到第i个数时,较大的和与较小的和相差j,较小值为dp[i][j],则每次仅包括三种转移方式:1.不取 dp[i][j]=max(dp[i][j],dp[i-1][j]);2.加入较小的一组: dp[i][abs(j-num原创 2018-01-07 20:45:29 · 345 阅读 · 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 · 615 阅读 · 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 · 480 阅读 · 0 评论 -
洛谷 P3523 [POI2011]DYN-Dynamite
题面题意 给出一棵树,树上有一些关键点,现在你最多选择m个点,使所有关键点到这些你选择的点的最小距离中的最大值最小.做法 一开始想到的是树形dp,但因为数据过大,且处理麻烦. 正确做法是先二分答案,再用贪心的思想来检验,但记录仍有麻烦 记录时每个点记录两个值,一个是离他最远的并且不在当前选择的点的覆盖范围内的点与他之间的距离,一个是离它最近的已选择的点距他的距离. 转移时原创 2018-02-09 16:11:40 · 313 阅读 · 0 评论 -
CodeForces - 337D D. Book of Evil
题面题意 给出一棵树,其中有且只有一个节点上有魔鬼,与它距离在d以内的点都有可能收到影响,先给你这些收到影响的点,问几个节点上可能有魔鬼做法 首先可以证明:如果有一点到这些点中的最远的两点的距离均小于等于d,则这点上可能会有鬼. 之后问题就转化为了找收到影响的点中的最远两点. 又可以证明:以任意一点为根,两点中一定有一个点的深度最大. 因此可以先以1为根,dfs,找到此时原创 2018-02-10 19:59:11 · 239 阅读 · 0 评论 -
C. Ilya And The Tree codeforces 842 C
题面题意 有一棵树,一开始每个点有一个初始值,每一个点的新数为它到树顶的路径中的所有数,去掉一个数后的最大公因数中的最大值.做法 因为要去掉一个数,所以一个个枚举显然不显示,因而可以在dfs时记录一下此时的点到根的数的因数个数,也就是每扫到一个点都将其分解质因数(记得回溯),若新增的因数的个数达到其深度-1,则这个数可用,在分解的同时找到最大的. 但还要考虑不是新增的因数,即去掉的数原创 2018-02-10 21:07:21 · 196 阅读 · 0 评论 -
CodeForces - 686D D. Kay and Snowflake
题面题意 给出一棵树,多次询问以某个节点为根的子树的重心.法一 倍增 易知一棵树的重心满足整棵树减去重心的子树大小小于等于整棵树大小的一半,而且重心的最大子节点的子树大小也小于等于整棵树大小的一半. 因此可以用倍增维护某个点的第2^i个最大子孙节点(沿着子树最大的子节点找下去),不断比较大小,复杂度O(n*logn).代码#include<iostream>#include<cs原创 2018-02-11 10:20:19 · 373 阅读 · 0 评论 -
bzoj 2323: [ZJOI2011]细胞
题面题意 给出一个数字串表示一个细胞,将其分为若干段等大小球,每个球内有一段数字,每一段再分为该数字大小个小球,每个小球与两边的有丝连接(除了两头的),每一个小球至少退化一条丝,那么有几种不同的分法.做法 经过分析之后,可以发现分段与去掉丝两部相互独立,而且退化这一步的种类数恰好是斐波那契数,因为数字大小是10^100级别的,因此要用矩阵快速幂来写,然后问题就在与分段. 可以用dp来原创 2018-02-26 19:15:21 · 291 阅读 · 0 评论 -
Find a multiple POJ - 2356
题面题意 给出n个数,是否可以选出一些数使它们的和为n的倍数,能则输出方案,反之输出0.方法 这题一开始只想到n^2的搜索,TLE了. 看了题解之后发现可以用抽屉原理证明一定存在一个解是一些连续的数. 因为一共n个前缀和,它们对n取模一定存在两个相同或是为0. 如果为0,输出这个前缀. 如果有两个相同,则输出它们中间的这段数.代码#include<iostream原创 2018-02-07 21:22:02 · 248 阅读 · 0 评论 -
点分
作用 在树上实现,通过分治的方法,使原来需要复杂度为n^2的做法变为n*logn.实现方法 首先找到树的重心,然后以重心为根,考虑需要用到根的部分,之后去掉根节点,将原来子树分成多个小于原来大小的一半的多棵子树,再用上述方法反复处理,不难证明复杂度为n*logn. 因此点分的核心代码就是统计每个点的子树大小和找到根节点.void getsz(int now,int last){原创 2018-03-07 17:45:21 · 1753 阅读 · 0 评论 -
洛谷 P1430 序列取数
题面题意 给出一个序列,两人轮流从一端开始取任意个数,最后所取数的和即为得分,两人都想要较高得分,则先去者的最高得分是多少。做法 首先不难想到用dp[i][j]表示序列剩下从i到j这段时的最高得分,这样的话有n^2种状态,n的状态转移,总复杂度为n^3,会T。 因此可以考虑记录下述值: le[i][j]表示从左边开始取,剩下的数取到的最高分的最小值,也就是说: le[i]原创 2018-03-07 23:28:46 · 465 阅读 · 1 评论 -
洛谷 P3286 [SCOI2014]方伯伯的商场之旅
题面题意 给出l,r,k,求将l与r之间的数进行x操作的最小代价. x操作指将一个数转化为k进制,表示有几堆石块,每对石块恰有该数位上的数个石子,相邻两堆距离为1,将它们并成一堆,代价为石头数量*距离.做法 因为l和r的范围都高达1e15,故考虑数位dp,而此题难点就在于难于记录状态. 一开始想到的是枚举集中在哪一位集中和代价之和,再分别相加,而因为一个数可以在代价不变的情况下原创 2018-03-08 18:31:08 · 430 阅读 · 1 评论 -
BZOJ4502 串
Description兔子们在玩字符串的游戏。首先,它们拿出了一个字符串集合S,然后它们定义一个字 符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀。 比如对于字符串集合{“abc”,”bca”},字符串”abb”,”abab”是“好”的(”abb”=”ab”+”b”,abab=”ab”+”ab”),而字符串“bc”不是“好”的。 兔子们想知道,一共原创 2018-03-15 18:43:23 · 545 阅读 · 0 评论