- 博客(143)
- 收藏
- 关注
原创 【题解】洛谷P1314 聪明的质检员(前缀和 二分 数学)
还是没想出来正解。。不过题解一看就会系列qaq同类型的题还得多练https://www.luogu.org/blog/codinging/solution-p1314注:代码里的最大值不够大只有50分 建议开的大一点 亲测1e15可以过#include<cstdio>#include<iostream>#include<algorithm>...
2018-08-18 15:06:31
300
原创 【题解】洛谷P1901 发射站(栈 单调队列)
一开始做时百思不得其解,于是打了个暴力居然有60分。。正解其实挺好理解的,不过我想不到、。。附链接https://www.luogu.org/blog/user41569/solution-p1901#include<cstdio>#include<iostream>#include<algorithm>#include<cstri...
2018-08-18 14:46:55
326
原创 【题解】洛谷P2264 情书(字符串 模拟)
显然这道题我们用字符串存储感动词汇,然后读入正文时读一整行,比较部分字符串会更方便 这里学到了几招。1.要考虑把大写都转成小写,不会stl库就将所有大写字母加上'a'-'A',就变成小写形式了。2.初始化一个空白字符串 sent=“”,然后在读入正文时倘若读到的不是空格/逗号/句号,就令sent+=zw[i],可以直接将字符类型变成字符串。注意在判断空格/逗号/句号末尾将sent变回“”即...
2018-08-18 14:20:30
346
原创 【题解】洛谷P3469 BLO-Blockade(tarjan 割点)
建好图后,我们可以通过dfs记录某一个点之后的子节点个数,并不断更新dfn和low值,如果low值大于等于dfn值(大于代表是一条链,等于代表是一个环),这样都会出现去掉该点后将图分成两部分的情况,所以我们将该点以下子节点个数累加,记录答案为对于每个y及y后的结点*(n-每个y及y后的结点),注意这么操作后会导致只统计要去掉那个点之后的所有结点到要去掉的那个点的距离,而答案我们还需要记录要去掉的那...
2018-08-17 20:23:02
333
原创 【题解】洛谷P1850 换教室(暴力80)
直接顺序枚举换几节课,并枚举所有的情况并算出答案#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>using namespace std;const int maxn=2100;const int...
2018-08-17 17:26:55
331
原创 【题解】洛谷P1600 天天爱跑步(60分暴力)
NOIP2016最难的一道题目,正解不会系列。。然而那年每道题都有比较详细的分段范围,所以我们可以尝试拿到部分分。这里提供部分分为60分的做法。Sample 1 2只有当某个点时刻为0时才有可能观察到选手 因此我们先将初始状态每个点的选手数目统计下来 然后对每个点的时间遍历 如果时间为0输出该点选手数目 否则输出0Sample 3 4由于时间为0, 所以我们将初始状态每个点的选...
2018-08-17 16:21:44
493
原创 【题解】洛谷P1433 吃奶酪(dfs)
首先处理出每两个点之间的距离,然后从起点开始遍历所有点,找出最大值即可,注意坐标不一定是整数。。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using namespace std;int n;double maxx=1e9;struct p...
2018-08-13 21:20:38
659
1
原创 【题解】洛谷P1434 滑雪(记忆化搜索)
枚举每一个点,从每一个点开始扩展求出每个点的最大长度,最后求最大长度的最大值。这是一般的dfs的想法,在此题中可以得90分。想要通过最后一个点,我们需要使用记忆化搜索。开一个数组记录每个点的最大长度,当dfs到该点时就返回这个点的最大长度,可以节省非常多的时间。代码如下#include<cstdio>#include<iostream>#include<al...
2018-08-13 21:18:25
355
原创 【题解】洛谷P1141 01迷宫(dfs 连通块)
不想写bfs 就用dfs来解决,普通的思路很好想就不说了,反正只能得70分。为了节省时间,我们可以考虑连通块的做法,将从某个点移动到达的所有点的数量记录下来,存在数组里,给这个点的vis打上一个标记。然后对于询问的某个点就输出num[vis[i][j]]就好了#include<cstdio>#include<iostream>#include<algor...
2018-08-13 17:27:30
513
原创 【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)
显然这道题可以用bfs解决。我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了。但关键是dis数组的范围,倘若按照从数字编号,dis是肯定存不下的。我们注意到9个数的全排列是9!种,362200种可能,这个数还是比较小的,所以我们可以考虑把情况压缩成这种状态,但如何操作呢?这里就要用到...
2018-08-13 16:52:29
1026
原创 【题解】洛谷P2022 有趣的数
题解半天看不懂系列。。。这里可以模拟一下,我们首先要求数值比k小,但字典序在k前面的数的数量,用cnt表示。这里为了方便,我们可以采用代码中的方式计算。然后特判无解的情况。接着我们对比k大、字典序在k前面数的数量吗,逐渐扩大N,以K的10^i扩大,当ans>m时,ans=(k*10^i-(ans-(M-1)+1))//减出多余的部分。#include<cstdio>#...
2018-08-12 21:39:30
398
原创 【题解】洛谷P2312 解方程(高精 数学)
一道非常玄学的问题。如果想要拿到全分,有时候还要靠一点运气由于我们发现系数非常非常大,所以我们用字符串读入,然后将其转化为数字类型,存到数组里。这里为了通过这道题,我们开三个数组,其意义是相同的,但在计算过程中分别对三个不同的数取模。然后我们从1开始枚举到模数1,利用秦九韶公式,按照题目要求将枚举的数带入计算 如果结果是0,就在mod1后扩展许多类似1-mod1的数组,计算答案,连续两次后...
2018-08-12 20:01:02
208
原创 【题解】洛谷P2296 寻找道路(最短路 bfs)
这道题理论上用bfs是可以解决的,但要判断的条件比较多。看到数据范围后,我决定还是用最短路来解决更加方便。思路就是我们要处理出不能用的点,然后跑最短路时判断如果出现这个点跳过就好了。判断不能用的点,我们可以从终点开始扩散,将到达的每一个点打上标记。这样我们就可以初步找出从起点出发进入某个点是死胡同的情况。处理出这些点后,我们再从起点出发,对每一个打过标记的点进行操作,如果打过标记的点扩展出...
2018-08-12 19:56:09
471
原创 【题解】洛谷P2038 无线网络发射器选址
一道非常暴力的模拟。。。不用想各种优化,就从0到128枚举就好了。注意边界条件,如果左或右超了就变成0或者128。这道题一开始我想读入后排序找左上右下然后找出一个安装范围,后来发现这个节省不了多少时间。。而且还错了qaq 所以看到数据范围后直接枚举就好了。#include<cstdio>#include<iostream>#include<algorithm...
2018-08-12 19:49:48
330
原创 【题解】洛谷P1443 马的遍历
1.注意输出格式 printf("-5d")代表左对齐,空5格。2.team数组要开的大点。。否则会WA或者RE一些点。3.结构体来存team数组,最后要判断到不了输出-1好像也没啥了。。。#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>...
2018-08-11 22:10:20
289
原创 【题解】vijos P1206 coVH之再破难关
这道题可以用bfs解决。对于判重我们可以将读入的图看做二进制数字,将其转化为十进制,记录下来是否访问过即可。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int mapp[5][5];struct n...
2018-08-11 22:07:07
377
原创 【题解】洛谷P2320 鬼谷子的钱袋
这里有一种神奇的做法,也是理论上的最优值。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int a[120];int m;int ans=1;int main(){ scanf("%d",&a...
2018-08-11 17:29:03
161
原创 【题解】洛谷P2165 飞行棋
如果有两个点是矩形对角线的起点和终点,那么其之间的弧长必然是周长的一半,我们把具有这种关系的点的对数量记录下来,用组合数求出凑出两对共有多少种方法即可。对于两个点之间的距离,我们用前缀和来表示。#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int s...
2018-08-11 17:27:58
270
原创 【题解】洛谷P4050 麻将
枚举听牌 再枚举对子、刻子、顺子。记录下每一种牌的数量,e数组代表当前的情况,对数量大于3的种类的牌来说,%3就意味着拿出刻子,取模后剩下不够3的只能和顺子凑,所以它后面的两张牌要减去前面的数量。注意j要枚举到n+2,这样可以避免越界。#include<cstdio>#include<iostream>#include<algorithm>#in...
2018-08-11 17:14:59
276
原创 【题解】洛谷P1984 烧水问题(数学规律)
找规律的题让我非常头疼。。。首先我猜想的规律是每一次加热然后给后面那一杯加热50度,这个想法太naive了,只能骗到18分,所以我们得想正解。强行推规律吧。。消耗能量第一杯100J,第二杯50J,第三杯37.25J,问题可能集中在第四杯。我们前三杯的情况是 25,(100+25)/2,100℃,现在我们要把第四杯弄到100℃,所以将前面的三杯从小到达和第四杯中和热量,就可以得到31.7...
2018-08-11 14:50:20
359
原创 【题解】洛谷P1081 开车旅行(倍增)
这道题目的难度估计是noip之壁了吧。。。70分的模拟做法之前已经讲过了,现在来说说100分的倍增做法。首先,读入海拔后,我们可以预处理出从任意一个城市出发, 小A与小B能到达的下一个城市。思路就这么短,但代码非常繁琐,我感觉这部分甚至比倍增还麻烦。我们需要先将城市编号与海拔存在结构体内,对结构体按海拔高低进行排序,然后从1号城市到n号城市寻找其左右相邻的两个城市(还要这样离得最近),判断...
2018-08-10 21:58:35
474
原创 【题解】洛谷P2420 让我们异或吧(LCA 倍增)
根节点不需要思考 直接初始化为1即可开一个yh数组记录异或值,在倍增的同时将答案不断与其异或即可。其他的也没啥好说的 就是个普通的倍增#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>usin...
2018-08-10 15:16:40
262
原创 【题解】洛谷P1281 书的复制(dp)
https://www.luogu.org/blog/cccx2016/solution-p1281动态规划+贪心1、f[i][j]存的是前i本书分给第j个人,记录前缀和,初始化f[i][1]数组。2、三重循环更新f数组,k代表最后一个人拿第一本书的编号,前后比较最大值与之前答案最小值更新f数组。3、输出答案。使用贪心,因为要求前面的人尽量少抄写,所以我们可以记录读入数据之和来更新...
2018-08-10 14:15:22
469
原创 【题解】洛谷P1613 跑路(倍增 最短路)
这道题一开始很不好想,因为是有向图且不能只求最短路后倍增,因为绕弯子可能绕出来的总路程恰好是2的倍数能1s跑完。不过题解第一篇给了很大的启发。这道题目求1号点到n号点最短几秒到达,那么我们可以把两个点之间经过的时间记下来,跑最短路就好了。开布尔类型三维数组b[x][y][k],代表从x到y是否存在一条2^k长度的路径。初始化距离为最大值,b数组为false。读入数据时,将读入的两个点之间的距离连上...
2018-08-08 21:09:55
277
原创 【题解】洛谷P1967 货车运输(最大生成树 倍增)
前排提醒,对于倍增数组可以开大。。但千万不能开小,否则结果一定不对。。在这里卡了2h。。。可以发现有一些权值较小的边是不会被走过的。正如样例中的第三条边,就算有其他的很多条边,这条边无论如何也是不会被走过的。于是我们想到了可以将图中这样的边去掉,按照这个思路我们便想到了构造最大生成树,将其余的边去除。得到了这样一个树之后,我们便考虑如何求出两个节点之间最小边权的最大值(即为题中的最大载重)...
2018-08-08 20:18:46
332
原创 【题解】洛谷P3379 最近公共祖先(模板)
暴力70分思路:记录下每个点深度与其父亲节点,对于要查询的深度较深的点一直往上跳,跳到与另一个要查询的点深度相同为止。然后两个结点一起往上跳,直到两个结点相遇,输出答案。思路是正确的,但每一次只能跳一步,在很深的树操作难免会超时,这里我们使用倍增来解决这一问题。我们知道用1,2,4,8,16,……2^i这些数可以凑出任何一个数(不知道为什么看看它们的二进制,然后你就明白了),所以我们每次可...
2018-08-08 16:25:51
339
原创 【题解】洛谷P2334 营业额统计(链表)
题解里有各种神奇的算法,实际上我们用链表模拟一下就可以解决。。读入数据后我们记录下其序号和代表的值,然后按值从小到大进行排序,再对序号从大到小进行左右比较操作(排序后左右差值绝对值较小的一个肯定是它之前天数内营业额减当天营业额绝对值最小的一个),把答案加上,再把左右数组更新。注意到1时只剩它一个了,这时候特判把序号为1的权值输出即可。代码很乱。。。凑合看吧#include<cs...
2018-08-08 14:42:41
460
原创 【题解】洛谷P1484 种树(堆)
不难想到这道题需要处理权值最大值,而为了节省时间我们可以用大根堆来解决。贪心的方法是把堆顶元素移除,并标记它与其相邻两个元素不可用,然后在那个位置添加上权值为左边+右边-堆顶值的元素,这样假如我们再找大根堆找到那个新加上的元素,就等效于我们选了第一次那个坑的左右两个坑。具体实现的话我们开结构体,在堆里存下坑的序号与权值。并开数组记录某个坑的权值、某个坑左边那个坑的序号、某个坑右边那个坑的序...
2018-08-08 10:35:23
289
原创 【题解】 洛谷P2278 操作系统(堆)
堆可以很好地实现模拟的一些思路。我们首先要开一个结构体,记录下操作的序号、时间间隔与优先级。接着对堆内大小比较重载运算符,保证每次堆顶都是优先级最大、若优先级相同则是编号更小(更早进入)的元素。然后我们在读入一个新的元素时,需要对当前堆内的每一个元素进行判断。当堆不为空时,用当前的时间加上堆顶元素处理经过的时间,如果比读入的那个元素时间小就把当前时间更新(加上堆顶元素处理时间),输出堆顶元素编...
2018-08-08 09:02:52
266
原创 【题解】洛谷P2085 最小函数值(堆)
这个题和序列合并非常相似。只不过传的参数多了一点。。想了解思想的可以去我之前博客序列合并那道题看。由于函数系数为正整数,所以对每一个函数来说在正整数范围内都是增函数,知道这一点就可以解决这个问题了。#include<cstdio>#include<iostream>#include<algorithm>#include<queue>...
2018-08-07 22:21:24
264
原创 【题解】洛谷P3378 堆(模板)
正式比赛时我们肯定不愿意手写堆,不过作为一道模板题,我们还是手写一下并体会堆的过程比较好。小根堆的存在形式是一棵二叉树,根节点是最小的数。我们初始化树上所有节点的权值为INF。当要添加一个数x时,我们把当前编号+1,把数放在那儿,并记录下当前编号。然后不断将其与其父亲结点进行比较,如果小就交换,并让记录下来的该数的编号除以2。(对于二叉树来说 父亲节点编号为x,那么它两个儿子节点编号必然是x*...
2018-08-07 21:58:48
713
原创 【题解】洛谷P1801 黑匣子(堆)
怎么求一个堆内的第k小的值呢?我们可以把问题化为两个堆来解决。存一个大根堆一个小根堆,小根堆负责读入元素。a数组记录要读的元素,b数组记录当前位置。读入当前的范围内饱含的元素,并把这个元素放到小根堆里,如果大根堆非空(注意!!!)并且大根堆堆顶比小根堆堆顶要大就交换堆顶,最后输出小根堆堆顶,把它堆顶扔到大根堆里,代表已经找到了第i小的数。关于大根堆里的数是否能更新小根堆上面已经操作过了。...
2018-08-07 21:45:57
263
原创 【题解】洛谷P1631 序列合并
https://www.luogu.org/blog/user23845/solution-p1631这里我把序号存在结构体里,这样堆里需要比较结构体,重载运算符。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<que...
2018-08-07 20:07:19
357
原创 【题解】洛谷P2361 yyy棋(模拟)
一开始百思不得其解,但看到提示说核心代码只有6行,再加上题目说一定有取胜的情况,看了看站长的解释,思路还是比较清晰的。https://www.luogu.org/blog/kkksc03/solution-p2361注意把buwanle的情况删掉。。不然会莫名其妙地挂#include<cstdio>#include<iostream>#include<...
2018-08-07 17:59:57
265
原创 【题解】洛谷P1351 联合权值(dfs、LCA)
这道题一开始啥也没想就用最短路写,才40分,然后发现自己对寻找最大值取模了,改了之后60分。。然后又发现n个点,n-1条边,其实这个图就是一棵树,每一个点到其余点的最短路有且只有一条,完全可以用dfs对每个点进行扩展,扩展两层找到点然后进行操作。。虽然看起来更简便了,但还是60分,所以我们得想更好的方法。为啥它让你找距离为2的点而不是距离为3、4……的点呢?我们可以发现,对于一个中心结点,它的...
2018-08-07 17:57:15
351
原创 【题解】洛谷P1941 飞扬的小鸟(dp)
Flappy Kotori是很好玩的游戏对于这道题目,我的第一感觉是动态规划,但不知道应该如何实现。但实际上还是能想到的,只是要注意许多细节。我们定义二维数组dp[i][j]代表到第i列第j个位置(如原题图)需要至少多少步。记录下每一列上升下降的格数up[i],down[i]。并初始化每一列能走的上限high[i]=0,下限low[i]=m+1。读入有油管的情况,将该列的上限和下限数组更新...
2018-08-07 17:46:15
375
原创 【题解】洛谷P1731 生日蛋糕(dfs,剪枝)
https://blog.csdn.net/BeNoble_/article/details/53201146去掉最大体积和第一个剪枝应该也能过妙啊
2018-08-02 20:33:51
329
原创 【题解】洛谷P1979 华容道(bfs)
这道题目注意反数组和dx与dy数组应对应#include<cstdio>#include<iostream>#include<algorithm>#include<cstdlib>#include<cstring>#define inf 1e9using namespace std;const int maxm=1...
2018-08-02 18:49:33
377
原创 【题解】洛谷P2161 会场预约(线段树)
先说一下这道题的解题思路,我们使用离线操作的做法。记录读入的数据,把开始结束日期存在结构体里,并记录是A操作还是B操作。开一个数组记录染色情况、一个cnt数组记录第几个操作推掉了几个预约,读入后我们倒着循环进行查找,如果读入的是B就跳过,如果是A的话就将开始到结束日期的所有点染成当前序号的颜色。如果循环到某段日期它已经有染色标记了,就将当前那段日期所对应的的染色标记的最小值的推掉的预约数+1(因为...
2018-07-30 22:07:23
287
原创 【题解】vijos P1659 河蟹王国(线段树)
实质上是对线段树的区间进行值的修改,然后查询一段区间内某个元素的最大值。注意可能有负数,所以在查询函数里ans初始化为-1e9注意在pushdown时除了把标记放下来还要把sum放下去,sum+=mark,否则举个例子 你得到了4-6的mark 把mark给了6-6,让你查询6-7,然后你的mark给了6-6 但你的sum没有给,所以需要如此更新。最后update函数返回子节点最大值即可。...
2018-07-30 10:21:53
215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人