ACWing
就叫啥也不会吧
这个作者很懒,什么都没留下…
展开
-
全球变暖(dfs和bfs)
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 22 座岛屿。由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。输入第一行包含一个整数N。以下 N行 N列,包含一个由字符”#”和”.”构成的 N×N字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。原创 2024-03-27 10:11:06 · 302 阅读 · 0 评论 -
树的重心(dfs)
#include <bits/stdc++.h>using namespace std;const int N = 1000, M = N * 2;int ans = N; //最小最大值int n;int h[N], e[M], ne[M], idx; //使用邻接表来存树bool st[N];//标记数组void add(int a, int b) { //表示将b插入到a的后面 e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}原创 2024-03-20 16:02:56 · 103 阅读 · 0 评论 -
走迷宫(bfs)
【代码】走迷宫(bfs)原创 2024-03-17 22:01:18 · 383 阅读 · 0 评论 -
堆排序(手写)
删除和修改第k个元素或者任意元素,需要维护两个数组一个是用来标记第k个插入的元素在堆中的位置ph[],另一个是堆中的第k个元素是第几个被插入的元素hp[]问题4:删除任意一个元素 heap[k] = heap[size];问题3:删除最小值 heap[1] = heap[size];问题5:修改任意一个元素 heap[k] = x;问题1:插入一个数 heap[++size] = x;hp[j]=k表示堆中下标为j的元素是第k个被插入的元素。ph[k]=j表示第k个被插入的元素在堆中的下标为j。原创 2024-03-09 17:06:08 · 340 阅读 · 0 评论 -
并查集(高频笔试题)
1.将两个集合合并2.询问两个元素是否在一个集合当中问题1:如何判断树根:if(p[x]==x)问题2:如何求x的集合编号:while(p[x]!=x) x=p[x];只有根节点的父节点是自己问题3:如何合并两个集合:px是x的集合编号,py是y的集合编号 p[x]=y问题4:为什么说路径优化之后的时间复杂度是近似于O(1)的。原创 2024-03-08 22:19:33 · 364 阅读 · 0 评论 -
区间和(离散化)
【代码】区间和(离散化)原创 2024-03-03 23:10:53 · 350 阅读 · 0 评论 -
最长连续不重复子序列(双指针)
关键是是s数组的变化,s[i]表示子序列中数字i出现的次数,如果i出现的次数大于1说明这个子序列就存在了重复的数字那么就要开始缩短子序列的长度,也就是左指针要向前移动同时s[a[j]]--,直到s数组中没有大于1的数字。给定一个长度为n的序列找出最长连续不重复子序列的长度。原创 2024-03-03 15:06:58 · 377 阅读 · 0 评论 -
整数划分(动态规划)
例如这个问题可以转成用n种商品(1~n)其中每种商品的体积就是自己的序号,然后用一个容量是n的背包来存放这些商品,每种物品可以取无数次,问能有多少种装法恰好把背包装满。这样就把问题转成了类似完全背包的类型,只不过完全背包要求的是最大价值,他的状态选择是max,而整数划分要的是种类,因此考虑的是sum。原创 2024-01-07 16:55:00 · 528 阅读 · 1 评论 -
区间动态规划
典型例子矩阵连乘和石子合并。原创 2023-12-25 22:42:51 · 349 阅读 · 1 评论 -
比特位计数
因为最高有效位对应的二进制数与要求的正整数的二进制数来说只有最高位的1是一样的其他全是0,那么我们用x-y的二进制数就比x少了最高位那个1,但是其他位数和j的二进制数是一样的,因此就可以用bits[x] = bits[x-y]+1来表示。那么问题就变成找到这个j,方法就是对于正整数x来说,找到小于等于x并且是2的整数次幂的最大数y,也就是找到x的最高有效位对应的数是什么,比如9的二进制数是1001,最高有效位对应的是1000也就是十进制的8,方法二:动态规划,最高有效位。方法三:动态规划,最低有效位。原创 2024-01-26 11:53:51 · 384 阅读 · 1 评论 -
单调栈(经典例题)找最近的小数
每次输入一个数x,就将它和栈顶元素比较,如果栈顶元素比输入的元素要大则抛弃它一直抛弃到出现比输入元素小的数字,那么这个数字就是离输入元素最近且最小的数字,当然有可能一直弹到栈里没有元素,那么就输出-1表示没有比x小的数存在,最后把x输入到栈里面。采用单调栈的思想来做,核心思想是当前面被输入的元素比后面被输入的元素还大的时候,那么前面这个元素就可以抛弃不要了,因为后面被输入的这个更小的元素一定是优先被输出,因此采用一个栈来存储输入的数。原创 2024-03-06 14:28:08 · 362 阅读 · 0 评论 -
区间合并(c++)
给定一个数n,表示n组区间,每个区间有一个起始端点和结束端点,合并所有能合并的区间,打印出合并后的区间和区间数量。原创 2024-03-05 16:38:49 · 436 阅读 · 0 评论