![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
做题总结
文章平均质量分 59
hhyy_d
这个作者很懒,什么都没留下…
展开
-
acwing周赛部分题解
1、22-构造数组解题思路:观察可以发现b数组始终是大于a数组的,而两个数组中的每个数都是从1-n中选择的,可以重复。因此第一步:从1-n中选择2m个数第二部:将这2m个数排序,大的m个数给b,小的m个数给a ------一种方案答案就是从1-n中选择2m个数有多少种选择方案。转化一:设x1,x2,x3,…xn表示这n个数在一轮选择中被选中的次数,即有x1+x2+x3+…+xn = 2m,那么这个不定方程解的个数就是答案转化二:设x’i = xi+1;x’1 + x’2 + … +原创 2022-06-07 18:02:18 · 315 阅读 · 0 评论 -
acwing周赛部分题解(36-54)
1、54场周赛-括号序列题意概括:反转一个括号类型,使得其中括号序列变得平衡解题思路:(1)统计左括号和右括号的数量,如果差值不为2,那么一定不可能变得平衡(2)如果是l == r+2,就反转字符串+镜像一下,让r == l+2(3)编写work函数,从前往后扫描一遍,cnt表示当前左括号数量-右括号数量,r表示右括号的数量和,当发现cnt < 0 的时候,说明要做出改变,将前r个右括号任选一个变成左括号,检验改变之后是否可行,首先cnt += 2,因为改变了一个右括号之后,前i个字符的差值为+2原创 2022-06-06 20:31:13 · 228 阅读 · 0 评论 -
差分约束例题
1、再卖菜差分约束问题是一个未知量与另外一个未知量的相对大小关系,因此,本题需要先转化成为前缀和的相对关系,并根据这个来建边经过分析可以知道,要满足上述的条件,需要如下条件成立当i = 1时,Si+1 - Si-1 >= 2b[i] && Si+1 - Si-1 <= 2b[i]+1;当i = n时,Si - Si-2 >= 2b[n] && Si - Si-2 <= 2b[i] + 1;其他情况 Si+1 - Si-1 >= 3b[i原创 2022-05-24 19:17:12 · 128 阅读 · 0 评论 -
5.20--无向图的双连通分量
1、边双连通分量 e-dcc不含有桥的连通区域极大的不包含桥的连通块2、点双连通分量 v-dcc割点:在连通的无向图中把这个点删掉之后变得不连通,每一个割点都至少属于两个连通分量。极大的不包含割点的连通块割点和桥没有必然联系,点连通分量和边连通分量也没有必然联系如何求解:1、边双连通分量,记录一个时间戳,dfn[x]、low[x]如何找到桥x到y是桥,搜完之后dfn[x] < low[y]如何找到所有边的双连通分量?(1) 将所有桥删掉(2) 用一个栈,类似于有向图的的解决办原创 2022-05-20 15:01:13 · 232 阅读 · 0 评论 -
5.6--欧拉路径和欧拉回路
能够有欧拉路径的条件:1、在无向图中,所有边都是连通的(1)存在欧拉路径的充分必要条件:度数为奇数的点只能有0或2个(2)存在欧拉回路的充分必要条件:所有点的度数都是偶数2、对于有向图,所有边都是连通的(1)存在欧拉路径的充分必要条件:要么所有点的出度均等于入度;要么除了两个点之外,其余所有点的出度等于入度,剩余两个点;一个满足出度比入度多1(起点),另外一个满足入度比出度多1(终点)(2)存在欧拉回路的充分必要条件:所有点的出度均等于入度。...原创 2022-05-06 18:22:03 · 1231 阅读 · 0 评论 -
5.5--有向图的强联通分量问题
定义:对于一个有向图,连通分量:对于分量中任意两点u,v,必然可以从u走到v,且从v走到u。强连通分量:极大连通分量作用:将一个有向图转为为有向无环图。缩点(将所有连通分量缩成一个点)然后就能够方便求解一些例如最短路等问题如何求:DFS将边分成四大类:如何判断某个点是否属于某个连通分量中:情况1:存在返祖边指向祖先节点情况2:先走到横叉边,横叉边再走到祖先节点一定是走到某个祖先节点上Tarjan算法求scc引入一个时间戳概念:搜索的时候按照顺序给每个节点一个编号对每个点定义两个时间原创 2022-05-06 14:29:09 · 183 阅读 · 0 评论 -
4.28日--线段树(一)
两个操作:push_up() 子节点的信息更新到父节点push_down() 父节点信息下传到子节点 (懒标记)线段树含有的基本操作1.pushup(u)2.build() 将一段区间初始化成线段树3.modify() 修改 单点和区间4.query() 查询某一段区间的内容原理:除了最后一层之外是一颗满二叉树,用堆的方法来存储,一维数组存储整颗树。n个点的区间需要开4*n倍空间。1、build函数void build(int u,int l,int r){ tr[u].l l原创 2022-04-28 23:05:20 · 641 阅读 · 0 评论 -
RMQ问题
问题模型:给定一个数组,再给定很多个查询,询问这个区间内的最大值或者最小值1、天才的记忆解题思路:f[i][j]表示以i开始2j个数的最大值,当j = 0时,f[i][0] = w[i],否则f[i][j] = max(f[i][j-1],f[i+(1 << j-1)][j-1]),查询的时候先求出最大的k,使得2k <= (r-l+1),对于查询的值 ans = max(f[l][k],f[r-(1 << k) + 1][k])#include <iostream原创 2022-04-27 22:18:15 · 162 阅读 · 0 评论 -
环形纸牌问题
1、均分纸牌题意概括:解题思路:可以分类讨论,先讨论1,n的情况,再从讨论[2,n-1]的情况。也可以直接遍历[1,n],如果a[i] != avg,那么a[i+1] += (a[i]-avg),ans++,对于这个式子的理解,如果a[i] > avg,那么需要向右传递,a[i] - avg为正数,反之需要向后一个索取,a[i]-avg为负数,达到了同时兼顾左边和右边,并且对于1和N,仅有一种情况。代码:#include <iostream>using namespace st原创 2022-04-26 21:10:27 · 173 阅读 · 0 评论 -
4.22--状态机模型
概念:一系列有序的事件特点:描述的是一些过程,不是类似与背包问题一样是一个结果。把混沌的状态细化1、例题:大盗阿福#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e5+10;int t,n;int a[N],f[N][2];int main(){ cin >> t; while(t原创 2022-04-23 13:09:35 · 279 阅读 · 0 评论 -
4.13学习-背包问题
序列dp:后一个数和前面的数存在关系背包问题:从某些数里选出一些数,组合dp。当背包问题优化为一维的时候,只有完全背包问题的体积是从小到大枚举的,其余都是从大到小循环。是两维的话没有任何限制。for 物品: for 体积: for 决策1.01背包问题:每个物品选、不选2.完全背包问题:每个物品可以选0~无穷个求所有前缀的最大值3.多重背包问题:每个物品可以选0~s[i]个枚举一下最后一个物品选多少个求滑动窗口内的最大值r = j%v如果给定了某种物原创 2022-04-14 22:35:19 · 177 阅读 · 0 评论 -
4.11日刷题--前缀与差分的另一种应用
1、统计方形题意概括:给定一个n行,m列的地图,统计其中的正方形个数和长方形个数解题思路:把这个格子看做是由a[n],b[m]生成,c[i][j] = a[i]*b[j],a和b的每个值都是1每个图形的生成都由a中连续的1和b中连续的1构成,因此求出不同长宽的矩形即可。利用差分可以预先处理好连续1的个数。#include <iostream>#include <cstring>#include <algorithm>using namespace std;原创 2022-04-12 19:32:39 · 157 阅读 · 0 评论 -
4.10日刷题--搜索+二分
1、P2392 kkksc03考前临时抱佛脚题意概括:对于给定的N个数组,把每个数组分成两堆,使得这两堆和的最大值最小,求每个数组按照这样分组之后的最小值之和。解题思路:观察数据范围之和发现可以枚举每个数组分成两堆的情况,按照题目要求求最小值即可,需要注意:并不是分成大小接近的两堆就是最大值最小的情况代码如下:/*4 1 1 11 2 3 160111不能按照左边一半,右边一半来选。否则这个点输出164但是答案是163*/#include <iostream>#in原创 2022-04-10 23:54:58 · 127 阅读 · 0 评论 -
4.9日刷题
1、P5198 [USACO19JAN]Icy Perimeter S题意概括:给定一个地图,然后求连通块的周长和面积。解题思路:面积就用dfs就能算出,周长求解的方式为在搜索的过程中,对于每一个点,如果周围越界了或者为点,周长++。#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef pair原创 2022-04-09 23:21:44 · 312 阅读 · 0 评论 -
4.5日刷题
1、积水面积解题思路:任何一个连续积水的地方满足h[left] >= h[right] 或者h[left] < h[right],只要把这两种情况找出来然后相加就可以。(之前像个大傻逼求最大值,这两者是独立的)#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e4+10;int n;int a[N],s[N];原创 2022-04-05 21:55:01 · 312 阅读 · 0 评论 -
4.2 日刷题
1、黑白棋子的移动解题思路:注意输入n的范围 <4 是无解的,我还傻傻的模拟半天。用递归求解,每个状态最终都会变成n = 4的时候的状态,然后直接输出即可#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 210;char str[N];int n;bool check(){ for (int i = 1; i原创 2022-04-03 17:59:58 · 180 阅读 · 0 评论 -
4.1日刷题
独木桥三连击阶乘之和车站P1012.拼数完美矩阵子矩阵计数整数分组原创 2022-04-02 18:13:29 · 171 阅读 · 0 评论 -
3.30日洛谷
1.删数问题解题思路:这样进行贪心:如果存在逆序的关系str[i] > str[j],那么就把str[i]删掉,然后从头开始遍历字符串,这里一定会有逆序的关系,因为超出str的范围之后是最小的,也就是最后一个字符一定大于之后的字符。#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 260;string str;int原创 2022-03-30 23:27:42 · 134 阅读 · 0 评论 -
题目汇总(ACWing)
枚举:1.拍照解题思路:枚举a1,求出每个ai,然后检查这个答案是否合法。2.牛为什么过马路解题思路:对于一对相同的字母,枚举中间是否存在没有记录的单个字符。3.牛的基因组学解题思路:暴力枚举每一列,查看是否有可以区分两种牛的基因贪心:1.疯狂的科学家解题思路:可以利用类似双指针的思想去找到a,b字符串连续的不同的地方。bfs:1.社交距离II解题思路:首先求出感染的最小半径,也就是没有感染的牛到感染的牛的最小距离,然后按照位置顺序利用bfs遍历每一头感染的牛,看看它能感染哪些牛,每原创 2022-03-17 21:24:33 · 828 阅读 · 0 评论 -
3.8日刷题总结
今天做了以下几题:洛谷:1.P2419 [USACO08JAN]Cow Contest S2.P7228 [COCI2015-2016#3] MOLEKULE3.P6591 [YsOI2020]植树4.P1037 [NOIP2002 普及组] 产生数解题思路1.假设现在你所在的班级成绩发布,你想知道自己的排名,如果你知道前面有多少人比你高,后面有多少人比你低,那么就可以得到你自己的排名。因此,此题首先采用floyd算法求出其中存在的大于和小于关系,统计每个节点的入度和出度,如果入度+出度==N原创 2022-03-08 23:42:36 · 181 阅读 · 0 评论 -
贪心问题之区间
区间选点最大不相交区间数量区间分组区间覆盖关于左端点排序还是右端点排序的思考(参考 ACwing):1、如果想知道只有一间教室,能安排下的最多不冲突人数(不是所有的人都有机会,有的会被舍掉)是多少(区间选点和最大不相交问题),那么当然是最先结束的人排在前面,这样后面的人才有更多机会。如果是按左端点排序,那么如过一个人0点开始用,那么肯定他排在最前面,但是如果他自己就占用了24小时,那么只能给他一个人用了,这样就达不到最大的效果。所以按右端点排序。2、如果想知道这些人都必须安排,没有人被舍弃,至少原创 2022-02-25 09:53:10 · 238 阅读 · 0 评论 -
关于二分一些模板
1.一般的二分模板有两套,假设a数组是一个上升数组,待查找的为x。//查找第一个出现的x,如果没有x则输出待插入的位置。int search(int l,int r,int x){ while(l<r) { int mid = (l+r) / 2; if(a[mid]>=x) r = mid; else l = mid+1; } if(a[l]<x) return l+1; else return原创 2022-02-23 21:47:34 · 60 阅读 · 0 评论 -
从暴力递归到记忆化搜索再到动态规划
在洛谷或者力扣刷动态规划的题,总是想破脑袋也想不出状态转移方程是怎么写出来,看答案很多人都写出来了,这时候就开始怀疑自己的智商了,一个简单的题的动态转移方程都不会,最近看了左神的讲解,才明白这其中是有套路存在的。例子:有一个硬币面值数组arr,比如[100,24,35,76,50],再给出一个目标值比如1000,每个硬币适用不限量,问你有多少种组合方法,使得总和为目标值。接下来将一步步的阐述暴力递归是如何到动态规划转移的。1.暴力递归基本思路:首先我们要明确可变参数是什么,要将所有的可变参数找出来,本原创 2021-11-19 22:27:37 · 453 阅读 · 0 评论 -
近日做题总结1
今日做题新学了几个技巧和算法1.二分答案: 利用二分的方法,将一个最值问题转化为了判定问题。有一个?check函数,判断给定的值是否合法,主函数里就是一个while循环进行二分。适用于求最大最小值,例如min(所有情况)max(四个地区奶牛数量)。 例题:(1)数列分段(2)P1873 [COCI2011/2012 #5] EKO / 砍树(3)P2678 [NOIP2015 提高组]跳石头2.二维前缀和: 例题: P2280 [HNOI2003]激光炸弹3.数据离散化: 有..原创 2021-11-12 20:21:55 · 192 阅读 · 0 评论