- 博客(88)
- 收藏
- 关注
原创 [NOIP2013]积木大赛 [NOIP2018]道路铺设 贪心/差分
积木大赛原题链接:登录—专业IT笔试面试备考平台_牛客网 AC代码:道路铺设登录—专业IT笔试面试备考平台_牛客网 AC代码:一样的思路,可以自己写一下~
2022-06-23 11:05:49 499 1
原创 C. Helping the Nature(cf)差分
题目大意:给你一个数组a,其中每个数的范围是−1e9≤ai≤1e9,每一次操作可以在以下操作中选择:1)把a1 ... ai所有数减一2) 把ai ... an所有数减一3)把a1...an整个数组中所有数加一问你最少操作次数使得整个数组中每个元素都为0?...
2022-06-20 16:03:07 527
原创 只能交换相邻两数得到相应序列 树状数组
有两个序列对于序列b,每次只能交换相邻两个数求将序列b变成序列a需要的最小交换数套路都是一样的:把序列每个值对应一个升序的值,然后把b用a来转换,再把b变成1...n的升序的最小值,就是求逆序对的数量来个例子:a 1 4 2 3b 3 2 4 1把a中每个数与列数对应:1 -> 1 4 -> 2 2 -> 3 3 -> 4那么我们就可以把a看成 1 2 3 4那么把b每个数用相同的转换规则转换 b : 4 3 2 1把b变成a即把b变成升序
2022-05-11 23:56:50 613
原创 P2432 zxbsmk爱查错 (dp)
原题链接:zxbsmk爱查错 - 洛谷思路:求的是最少需要剔除的字母数,按照dp的思想:f[i]:字符串从1到i变成合法句子最少需要剔除的字母数如果字符串长度是n,有m个单词,那么对于i,每次都从后往前与每一个单词进行匹配,并且找到与这个单词最近匹配完的位置(如果能匹配完就可以转移,不能匹配就转移不了),并进行状态转移。注意:1)先考虑把s[i]删掉的情况,f[i] = f[i - 1] + 1; 2)然后再考虑与每个单词一一配对的情况:如果...
2022-05-10 21:05:53 204
原创 P1868 饥饿的奶牛 (线性dp)
原题链接:饥饿的奶牛 - 洛谷思路:选择不重合的区间让区间点数最多,我想到了把每个区间左右端从小到大排序然后写dp,但是又有问题了,如果中间有一段是空着的那递归的时候f[i]就很难从f[i - len]转移过去,而且就算排了左端点的顺序,但是还是觉得顺序很乱,因为右端点也不确定...所以其实就找到最大的端点mmax,然后从0开始顺着找到mmax,每次先f[i] = f[i - 1],如果对于一个端点,它是一个右端点,那么它就有机会从它的左端点转移过来。所以用一个vector把所有右端点的左端点..
2022-05-10 20:49:51 466
原创 P2380 狗哥采矿 (二维dp)
原题链接:狗哥采矿 - 洛谷思路:我一开始想的是,一个点往左走还是往上走与它上面和左边的点走的方向有关系,但是感觉复杂交错.....然后看到了大佬的二维dp,其实Aij往左走,就让它左边的这一条都往左走然后加上这些值;Aij往上走,就让它上面的点都往上走,然后加上这些值...我确实没太想到用二维前缀和这样的递推..还是要多做题多思考!AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long ...
2022-05-10 20:35:06 269
原创 P1613 跑路(dp + Floyd)
原题链接:跑路 - 洛谷参考:题解 P1613 【跑路】 - Hydra_ 的博客 - 洛谷博客大佬代码注释写的很详细了,没看明白底下我写的代码的可以去看看大佬写的其实能这么写还有一个条件,就是你看,它的每一条边的长度都是1,所以用倍增。想想看,如果一条边是1,一条边是3,1 + 3是2的2次方,但是如果找的是2^(k - 1)和2^(k - 1),结果就会不对了。所以还是要明白一下题目为什么可以这样用倍增的思想~另:maxlongint不知道是啥,就看成long long开2^6...
2022-05-10 20:27:33 267
原创 P4677 山区建小学 (dp)
原题链接:山区建小学 - 洛谷思路:参考:题解 P4677 【山区建小学】 - hsfzLZH1 的博客 - 洛谷博客注意:1) 细节方面格外要注意,初始化要注意,这个题如果 dp[i][0]当i不为0的时候会有问题,因为不会存在前面i个村庄都没有学校(相当于前面距离和为0)然后后面的村庄有学校的情况;2)而且题目给的是n - 1个距离,可以先设a[1] = 0,然后依次得到a[i]的坐标(相当于坐标)AC代码:#include<bits/stdc++..
2022-05-08 12:13:50 488
原创 P1799 数列(删数dp)
原题链接:数列 - 洛谷还是dp,还是好难呜呜~看看大佬题解叭:题解 P1799 【数列】 - muyang_233 的博客 - 洛谷博客AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define r..
2022-05-07 11:24:16 313
原创 P1537 弹珠 (多重背包)
原题链接:弹珠 - 洛谷看一个人能不能凑出sum / 2就可以了多重背包AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(i, n) for(int i = n; i >= 1; ++.
2022-05-06 19:50:21 259
原创 P1651 塔 (dp)
原题链接:塔 - 洛谷思路:int f[N][M]; //已经分配了第i个积木的时候高度差为j的两个塔中高的那个的高度四种情况:1.a[i]哪边都不放,高的塔最高值不变2.a[i]放在矮的塔而且最后矮的塔还是矮的塔,高的塔值不变3.a[i]放在高的塔,高的塔更高了,高的塔值加a[i]4.a[i]放在矮的塔,矮的塔增加了a[i]之后比高的塔高了,这时高的塔的那个值要改变,加j注意:1)我们每次的j值都是高的减矮的差值,即我们不会让j值成为负数,所以四种情况得判断j与.
2022-05-06 14:22:38 196
原创 P2422 良好的感觉(单调栈)
原题链接:良好的感觉 - 洛谷思路:枚举区间太复杂了,但是看看,所有区间的最小值最多有n个,那么找到这些最小值枚举最小值以及它们存在的区间就能得到答案。对于a[i]作为最小值的时候,是找它的左边最近的大于它的那个点和右边最近的并且大于它的那个点,然后区间我们就找到了。左边最近比它小、右边最近比它小--->单调栈。从前到后把a[i]的下标i入栈,如果前面有比它大的,就把栈弹出弹出..一直到栈顶的值小于等于a[i],那么这个时候的q[tail]值就是距离a[i]左边最近并小于等于a[i]..
2022-05-05 21:09:59 397
原创 P1284 三角形牧场 (dp 背包)
原题链接:三角形牧场 - 洛谷可以先看看大佬这个思路,写的非常清楚:P1284 三角形牧场 - Cxs3 - 洛谷博客然后再看我写的这些要注意的地方:思路:这个题不是直接用dp解决,而是先用dp判断三条边的长度是否可以由题目给的木板长度凑成(背包),然后再枚举每条边的长度,求取最大值。注意:1.因为每个木板都要用到,所以sum是确定的,那么其实知道了两条边,第三条边的长度也是可以知道的,所以只用对两条边的长度进行dp就行了。dp的时候先不管每条边是不是合法,只要能...
2022-05-05 19:39:11 363
原创 P2132 小Z的队伍排列 (dp)
原题链接:小Z的队伍排列 - 洛谷思路:我们可以考虑到,如果我们按从高到矮的顺序把每个人插入到一排之中,后面一排已经加入的数量一定是大于等于前面一排的而且加入到一排的时候一定是加入到队尾的,这样才能满足排头最高的条件。所以就按照顺序来,用dp来解决。我之前有点想不清楚,为什么每次只用判断相邻两排的大小关系就行了,之后发现因为abcde都是在枚举,很多量是用不到的,其实不太用管吧。AC代码:#include <iostream>using namespace s..
2022-05-05 13:34:17 704
原创 P1622 释放囚犯 (区间dp)
原题链接:释放囚犯 - 洛谷思路:反着考虑其实就是区间dp,类似石子合并问题,不同点是每次合并的时候记得把断点的个数加上而且要减去一个断点(每次合并的时候都是一个断点的两边进行合并)注意初始化其实就是len为1的时候即f[i][i] = 0(对单独一堆石子的操作代价为0)。AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<i...
2022-05-05 09:12:45 259
原创 P2112 鸿雁传书(dp)
原题链接:鸿雁传书 - 洛谷 我不知道这叫背包问题还是区间dp.. 反正就是顺着来,然后像往常一样的套路。有时候初始化会有点不同还是咋的,记得多想想多试试。注意初始化注意初始化 !AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; ...
2022-05-04 19:41:01 230
原创 P2002 消息扩散(图论 Tarjan缩点)
原题链接:消息扩散 - 洛谷思路:想一下就能发现,其实就是要找到有多少个入度为0的点,以它们为消息源得到的结果是最小的。但是有两个问题:有环、重边。有环->缩点,把强联通的几个点(一个环)缩成一个点,然后这个时候其实可以不用重新建图,遍历每一条边,记录每个点的入度,如果这条边的左右两个点属于一个环中,那么就不记录入度;如果不属于一个环中,就记录入度。AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define.
2022-05-03 21:23:29 530
原创 P1253 [yLOI2018] 扶苏的问题 (线段树)
原题链接:[yLOI2018] 扶苏的问题 - 洛谷思路:1.其实就是用线段树进行简单的区间修改(每个数修改为x, 每个数加x)和区间查询。因为有两种区间修改,所以分别用upd和add数组来标记;2.两个操作之间的关系:每次一个区间若修改为x,那么区间的add就要清空为0。每次下传标记先下传区间的update再下传add;3.pushup维护区间最大值;4.update改变整个区间每个值为x之后还是得要下传add操作,因为有一部分区间可能不会被这样更新,例如rt为1即区间范..
2022-05-02 20:04:15 1049
原创 P1265 公路修建(Prim最小生成树)
原题链接:公路修建 - 洛谷思路:其实就是最小生生成树。想想看,如果有2的情况,即三个点ABC,离A最近的点为B,离B最近的点为C,离C最近的点为A。那么把三条边设为a,b,c,即要满足a < c && b < a && c < b,这个式子是不可能成立的。除非这个图形是个正n边形,那么随便删去一条边,每条边的长度是一样的,所以其实就无所谓。因此就是一个求最小生成树的问题而已。注意一个地方!最后求的是double,那么可以先把平方和求出来.
2022-05-01 17:32:44 364
原创 P1247 取火柴游戏 (博弈论)
原题链接:取火柴游戏 - 洛谷题目描述输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第ii堆火柴棒的根数为ni;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取。谁取走最后一根火柴为胜利者。输入格式第一行,一个正整数k。第二行,k个整数 n1,n2,…,nk。输出格式如果是先取必胜,请在第一行输出两个整数a,b,表示第一次从第b堆取出a个。第二行...
2022-04-28 20:56:37 1926
原创 P1027 [NOIP2001 提高组] Car 的旅行路线 (图 最短路)
原题链接:[NOIP2001 提高组] Car 的旅行路线 - 洛谷AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(i, n) for
2022-04-20 19:57:32 391 1
原创 P1053 [NOIP2005 提高组] 篝火晚会
这题很好,先要用图的知识来判断,然后再思维,很牛,等我晚上回去写题解AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(i...
2022-04-20 19:50:10 1235
原创 线段树模板(区间/点查询 区间加法)
若只涉及点更新的题,不需要pushdown函数若只涉及区间更新的题,需要pushdown函数若为两种更新都有,则在所有向子区间查询或更新前,都需PushDown()#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef long long ll;typedef pair<int, int> PII;const double pi = acos(-1.0);#defin.
2022-04-14 00:09:53 151
原创 E. Pchelyonok and Segments(cf)dp
原题链接:Problem - E - Codeforces每日一遍,dp鲨我~思路晚上复习补AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#def..
2022-04-13 23:49:39 301
原创 D. Shuffle(cf)暴力枚举 + 组合数学
原题链接:Problem - 1622D - Codeforces题目大意:给你一串01串,告诉你长度n和一个数k,这个串中所有1的数量为k的子串,可以把这段子串重新排序。问你最后这个串能有多少种。思路:看第一个案例就知道会有重复的情况,但是区间重复不好算,又因为n为5000, n * n能跑,所以暴力枚举i, j(j > i,因为区间为一个长度的时候它跟谁换呢,换不了)作为第一个改变的地方和最后一个改变的地方。如果i ~ j区间1的数量<= k,就可以进行这样的操作。因为i和j下标的
2022-04-04 09:26:15 435 2
原创 D. New Year Concert(cf)gcd性质 + st表 + 二分
原题链接:Problem - 1632D - Codeforces晚上复习的时候再补全~#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(i, n
2022-04-03 20:28:46 628
原创 B. Catching Cheaters(cf)dp
原题链接:Problem - 1446B - Codeforces题目大意:给你两个字符串A,B,让你分别从A,B中截取子串(连续)C,D,然后这两个串的最长公共子序列长度是LCS(C,D),让你找到最大的4⋅LCS(C,D)−|C|−|D|的值。思路:这其实是最长公共子序列的变形呜呜我自己还是想不到~dp[i][j]表示以a[i]结尾b[j]结尾的子串C,D能使4⋅LCS(C,D)−|C|−|D|为最大值的值。如果a[i] == b[j],那么就由前面的dp[i -1][j -..
2022-04-03 18:52:08 552
原创 C. King‘s Path(cf)bfs
原题链接:Problem - 242C - Codeforces题目大意:给你一个1e9 * 1e9的棋盘,给你n个区间 r a b,表示r行的第a到b列是可行区域。问你从x0y0到x1y1最少多少步走到(可以走这个格子的周围一圈八个位置)。思路:注意题目最后说的一句话:It is guaranteed that the total length of all given segments doesn't exceed 1e5.最多给我们1e5个格子可以走,每个格子最多走到一遍,bfs没问
2022-04-03 11:34:03 366
原创 E1. String Coloring (easy version)(cf)贪心 + 排序
原题链接:Problem - 1296E1 - Codeforces题目大意:给你一串字符串,包含n个小写字母,让你给所有字母随意标0或1(两种颜色),然后你可以进行任意次操作,可以把位置相邻且涂色不同的字母交换位置,问你有没有涂色的方法可以使串最后变为字典序。思路:一开始完全没思路,想着某个字母如果排好序应该往左移还是往右移然后是啥颜色。但是想了想颜色还跟旁边要换的颜色要不同,交换顺序也不知道....还是对01串不敏感。想想,其实在一个串中,1和0可以任意游走直到碰到同类。也就是说,只要保证这两
2022-04-02 20:06:16 404
原创 B. Frog Traveler(cf)bfs
原题链接:Problem - 1601B - Codeforces题目大意:一个青蛙它从井底跳出去。从x点可以网上蹦[0, ax]的距离到y点,到了y点之后又会掉下来by步。问你它最少走多少步出去。问最少步数,想到用bfs。改了一下午代码,真的好细节呜呜。思路:它其实每次能向上跳到的范围一直往上,用mmin记录,往下跳的点和网上跳的点维护的东西不一样啊啊我又写不出来了但是我有时候能想清楚。这个博主画的图还有写的文很详细。之前看别的博主写的dp先滑再跳,我不是很懂。还是按照顺序来吧。挺难的毕竟19.
2022-04-01 19:38:52 677
原创 F2. Promising String (hard version)(cf)树状数组
原题链接:Problem - F2 - Codeforces题目大意:给你一个长度为n的字符串,仅包含'+'和'-'字符。两个连续的'-'可以变为'+',问你有多少子串,可以进行任意次数的两个连续的'-'变为'+'的操作,使得最后的这个串里'-''+'数量相同。问你有多少子串,存在可以满足这样数量的子串。思路:其实可以发现,'-'的数量一定是会大于等于'+'的数量,而且它们之差余3得为0,所以相当于维护树状数组的三种状态,然后从前往后查询和加入到数组数组中。如果后面有值与前面的值对3余数一样大,那
2022-04-01 11:12:37 713
原创 D. Rescue Nibel(cf) 区间覆盖 + 组合数学
原题链接:Problem - 1420D - Codeforces题目大意:给你n个灯,和每个等的亮的时间段,问你有多少种可以有k个灯一起亮的种数(如果k = 3而且灯 1 2 3在几个时间点都可以一起亮,只算一种。思路:用区间覆盖,{l, 1} {r + 1, -1},然后sort,维护时间点内灯的个数。每加进来一个等的时候,种数即为现在一定要这个灯,然后在剩下的灯中(维护的这个时间有的灯)选出k - 1个即为组合数,而且不会重复。AC代码:#include<bits/s.
2022-03-31 20:41:24 390
原创 A. Book 拓扑排序(cf) + dp
原题链接:Problem - A - Codeforces题目大意:给你一本书,有n页,每一次读这本书的时候都是从第一页读到第n页。每页有一个对应的list,每页对应有k页,必须读懂这k页才能读懂这一页(是不是很像拓扑排序)。思路:所以用bfs进行拓扑排序,并且用dp来维护状态:要读懂的这一页是在这一页前面还是后面,当前这一遍就可以读完还是下次才能读完......ans为-1的情况就是最后还有点前面还有点没读懂。有环的情况不会在队列中死循环,因为num[i]不为0时i是进不了队列的。AC
2022-03-31 19:58:20 468
原创 D. Nearest Excluded Points(cf)坐标反向BFS
原题链接:Problem - 1651D - Codeforces题目大意:给你n个不同的二维坐标上的点,然后让你分别找到离各店曼哈顿距离最近的点,且这个点不在给你的n个点之中(如果有多个答案,随便写哪个点都行)。思路:如果对每个点bfs,如果是个很密集的图,然后..就wa了。其实想想,很密集的时候,是不是有些点,从中间向外算的时候其实会重复访问查看很多点。我们知道最后找到的答案一定是这n个点上下左右空的点中的一个,所以我们可以提前把这n个点上下左右四个方向不在这n个点中的点加入队列,然后每次寻找
2022-03-31 18:39:12 455
原创 D. Distance in Tree(cf)树状dp
原题链接:Problem - 161D - Codeforces题意:很简单,问你在树中有几对点之间的距离是k解法:树状dp,从叶子节点往父节点开始推。每个父节点它的不同的子树,每次加进来一个子树就乘一遍,然后更新值,下次再乘(我说不清楚..下次画个图)呜呜dp都好难AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII
2022-03-30 20:26:07 306
原创 D. Good Substrings(cf)字符串哈希
原题链接:Problem - 271D - Codeforces其实就是暴力字符串哈希 + 判重注意:找所有满足条件且重复的不算的情况:set非常慢,如果用set来判重的话会很耗时间。所以可以把所有数据用vector来存,然后用unique来把重复的数都放在后面去,记得一定要先sort一遍://ans即为所有答案个数sort(v.begin(), v.end());ll ans = unique(v.begin(), v.end()) - v.begin();时间短的是用v.
2022-03-30 20:01:28 299
原创 B. Integers Have Friends(cf)二分 + st表
原题链接:Problem - 1548B - Codeforces解决RMQ(区间最值)问题的算法。总结的来说求rmq问题有多种方法:线段树,ST表等 线段树预处理O(nlogn),查询O(logn),支持在线修改 ST表预处理O(nlogn),查询O(1),但不支持在线修改先用st表预处理,然后再使用二分求出最大的区间长度,每次查询一个区间的时候用st表十分方便。我的二分在这里wa了很多发,注意如果n == 2的时候这个二分是进不了while循环的,所以我单独拿出来处理了;然后这个二分还.
2022-03-30 16:13:26 286
原创 小沙的remake(牛客)排序+ 树状数组 + dp
原题链接:登录—专业IT笔试面试备考平台_牛客网把a[i]先排序(带着下标排),然后从小到大每次先找下标在范围之内 [ i − b i , i ) 的所有种数,然后加一就是以a[i]为最后一个元素的所有种数。因为数据可能会很大,每次更新树状数组中的值的时候记得取模。如果有相减的时候,记得要加mod再取模。AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<
2022-03-29 18:52:40 1879
原创 炸鸡块君与FIFA22 线段树(牛客)
原题链接:登录—专业IT笔试面试备考平台_牛客网维护一个线段树的三种不同状态AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(.
2022-03-27 16:11:13 2161
原创 过桥(牛客)(逆推dp)
原题链接:登录—专业IT笔试面试备考平台_牛客网思路:其实如果走到一个a[i]是负数的地方,也就是要倒退,这样是没有用的。因为如果说前面还有a[i]大于0,我倒退回去了然后下一步能走到更远的地方,但是这样用的步数比之前就在那个地方的步数要多啊。所以说如果a[i]< 0,对答案是没有贡献的。我把没有贡献地方dp的时候设置为-1,那么下次碰到就直接跳过。n不大,双重循环能过。看了大佬思路我自己写的代码:#include<bits/stdc++.h>u..
2022-03-05 16:50:10 357
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人