ACM-图论/数据结构
文章平均质量分 63
ACM- 图论/数据结构
豆沙睡不醒
永远不要停下脚步
展开
-
2022杭电多校第二场1011 DOS Card(线段树)
题目描述输入描述输出描述。原创 2022-07-23 23:42:05 · 298 阅读 · 0 评论 -
【剑指offer】剑指 Offer 09. 用两个栈实现队列(C++ 模拟 栈 队列)
题目链接题意:用两个栈模拟队列,要求实现插入和删除操作。思路:栈的特点:先进后出队列的特点:先进先出所以用一个栈stk1维护插入操作,一个栈stk2维护删除操作。插入的时候,插入到栈stk1里。删除的时候,弹出栈stk2的元素。如果stk2为空的话,将stk1里的所有元素弹入stk2里,这样stk2的元素顺序就是队列删除元素的顺序,符合队列先进先出的特性。还有几个小细节:构造函数里要将两个栈清空;删除的时候,如果stk1也为空的话,则返回-1代码:class CQueue {pu原创 2022-01-17 15:26:27 · 519 阅读 · 0 评论 -
【 LeetCode 热题 HOT 100】3. 无重复字符的最长子串 (C++ 哈希 思维)
题目链接题意:给出一个字符串(长度为5e4),求没有重复字符的最长连续串。思路:由于长度为5e4,考虑O(n)O(n)O(n)的遍历。用map存储在当前位置之前该字符的最后一次出现的位置是第几个。las表示如果以当前字符串为结尾,能够保证不重复的位置。i-las+1就是以当前字符串结尾的答案。取最大值就好了。代码:class Solution {public: int lengthOfLongestSubstring(string s) { int ans=0,原创 2022-01-17 12:59:28 · 218 阅读 · 0 评论 -
【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)
linkkk添加链接描述题意思路常规最短路可以通过bfs解决,但是这个图的范围为1e6∗1e61e6*1e61e6∗1e6,bfs的复杂度为O(1e12)O(1e12)O(1e12),会超时。障碍的大小只有200个,从障碍入手考虑起点终点无法到达的情况就是起点被障碍包围或终点被障碍包围。障碍斜着放包围的格子最多,为n∗(n−1)/2n*(n-1)/2n∗(n−1)/2个所以如果从起点出发,经过的格子数大于这个的话说明起点没有被障碍包围。同理,终点也这样。如果在过程中,就已经到达终点的话,那原创 2022-01-11 16:00:35 · 352 阅读 · 0 评论 -
【力扣·每日一题】1005. K 次取反后最大化的数组和 (贪心 优先队列)
linkkk题意:思路:打完哈尔滨就没写过题,这次差点被每日一题卡住咯。题意很重要的一点就是可以多次选择同一个下标,所以用优先队列存一下所有的数,每次取最小的数变为他的相反数。正确性简单口胡一下:如果取出的数为正数,那么说明其他的数是比他还大的正数,将这个数变为负数的损失是最小的。如果取出的数为负数,那么他的绝对值最大,变为正数的贡献最大。代码:class Solution {public: int largestSumAfterKNegations(vector<i原创 2021-12-03 20:42:07 · 623 阅读 · 0 评论 -
CF1225D Power Products(分解质因子 哈希)
linkkk题意:给出长度为nnn的序列和kkk,问有多少个数对(i,j)(i,j)(i,j)满足ai∗aj=xka^i*a^j=x^kai∗aj=xk思路:首先,对所有的数分解质因子。当aia_iai和aja_jaj的质因子对应的指数之和mod k==0\mod k==0modk==0的时候,是一对合法的数对。问题就转化成了如何快速判断。大概有两种方法,一是选择用map,vectormap,vectormap,vector嵌套判断,二是用哈希。暂且不怎么会第一种所以写了哈希,对每个数分原创 2021-11-10 17:25:09 · 525 阅读 · 0 评论 -
upc-2021个人训练赛第27场 D: Values(思维+并查集)
问题 D: Values时间限制: 1 Sec 内存限制: 128 MB题目描述Given is a simple undirected graph with N vertices and M edges. The i-th edge connects Vertex ci and Vertex di. Initially, Vertex i has the value ai written on it. You want to change the values on Vertex 1, …, V原创 2021-07-27 19:38:56 · 349 阅读 · 2 评论 -
数据结构实训二——栈与队列
1.实验目的:(1)掌握顺序栈的和链队列的实现;(2)能利用栈和队列的基本运算解决实际问题;2.实验要求:车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供进出(栈结构)。汽车在停车场内按车辆到达的先后顺序依次排列。若停车场内的已停满汽车,则后来的车只能在门外的变道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入(队列结构)。每辆停放在停车场的车,在离开时按其在停车场停留时间长短交费(在这里假设车不能从门外等侯便道上直接开走)。试设计一个实现停车场管理的程序,按照从终端输入原创 2020-12-23 13:03:57 · 631 阅读 · 0 评论 -
luoguP6327 区间加区间sin和(线段树 sin公式)
原题链接思路:区间修改首先想到的就是线段树,考虑怎么样维护一个懒标。标记跟标记,值跟值的合并都可以直接合并,如何处理标记跟值的合并。∑sin(ai)−>∑sin(ai+v)\sum sin(a_i)->\sum sin(a_i+v)∑sin(ai)−>∑sin(ai+v)可以按照以下公式拆开:∑sin(a+v)=∑(sina)∗cosv+∑(cosa)∗sinv\sum sin(a+v)=\sum(sina)*cosv+\sum (cosa)*sinv∑sin(a+v)原创 2021-09-03 14:57:12 · 232 阅读 · 0 评论 -
luogu P2391 白雪皑皑 (并查集 思维)
原题链接题意:思路:由于颜色是可覆盖的,考虑倒着维护颜色。用rootiroot_irooti表示iii前面第一个没被染色的雪花的位置。由于是倒序枚举,所以对于每次染色,都暴力进行修改,找rootiroot_irooti大概是并查集维护序列连通性每个点最多被修改一次,时间复杂度O(n)O(n)O(n)代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned l原创 2021-09-02 20:22:58 · 138 阅读 · 0 评论 -
SWERC 2020 C. Safe Distance (二分 并查集)
linkkkkk题意:给出一个n∗mn*mn∗m的矩形,里面有kkk个点,从(0,0)(0,0)(0,0)走到(n,m)(n,m)(n,m),使得过程中和这些点的最小距离最大,输出最大距离。思路:看到最小距离最大,首先想到二分。比较思维的一个转化就是将运动轨迹看成是一个半径为midmidmid的圆,那么如果两个点之间的距离小于2∗mid2*mid2∗mid,这个圆就无法通过。由于点的数量只有100010001000,所以直接暴力枚举两个点是否相交即可。注意也要判断是否超过边界。可以用并查集维护连原创 2021-09-09 17:53:52 · 234 阅读 · 0 评论 -
luoguP2205 [USACO13JAN]Painting the Fence S(差分 扫描线思想)
linkkk题意:Bessie从围墙上的位置0出发,并将会进行N次移动(1 <= N <= 100,000)。比如说,“10 L”的意思就是Bessie向左移动了10个单位。再比如说“15 R”的意思就是Bessie向右移动了15个单位。给出一系列Bessie移动的清单。FJ 想知道有多少块栅栏涂上了至少K层涂料。注意:Bessie最多会移动到离原点1,000,000,000单位远的地方。思路:将区间的每个端点都保留下来,从小到大排序后,维护涂了涂料的个数nownownow,如果now原创 2021-10-03 09:12:42 · 192 阅读 · 0 评论 -
CF482B. Interesting Array(线段树)
原题链接题意:要求构造一个序列,使得满足m个条件,a[l[i]]&a[l[i]+1]&……&a[r[i]]==q[i]思路:根据&的性质,两个数&时,拆成二进制后,当两位都为1时,才是1。所以我们可以对[l,r]的数都|q,这样每一位都是q,这次操作里一定满足条件。对所有的条件都做这种操作,最后检验每个区间的数求&和是否还等于q即可,如果可以构造出来的话,查询值输出。可以用线段树维护区间修改|,区间和单点求&和的过程。代码:const in原创 2021-08-30 17:31:29 · 111 阅读 · 0 评论 -
牛客练习赛14 B.区间的连续段(前缀和 倍增)
原题链接题意:给你一个长为nnn的序列aaa和一个常数kkk。有mmm次询问,每次查询一个区间[l,r][l,r][l,r]内所有数最少分成多少个连续段,使得每段的和都<=k<= k<=k。如果这一次查询无解,输出"Chtholly""Chtholly""Chtholly"。思路:先考虑简化版:给定一个序列和kkk,问将该序列最少分成多少个连续段,使得每段的和都<=k<=k<=k。从前向后枚举,对于每次结果都贪心的考虑,如果当前和大于kkk就重新开一段。也就原创 2021-08-22 14:20:57 · 156 阅读 · 0 评论 -
2020ICPC昆明M.Stone Games(主席树)
求每个区间无法凑出的数原创 2021-08-19 20:42:37 · 316 阅读 · 0 评论 -
CF1567E. Non-Decreasing Dilemma(线段树)
linkkkk题意:给定一个长度为nnn的数组,两种操作:1.1.1.单点修改2.2.2.求区间[l,r][l,r][l,r]里不下降子串的个数。思路:跟线段树维护最大连续子段和类似维护左右端点,子串个数,从左端点开始的不下降连续序列长度cntlcntlcntl,从右端点开始的不下降连续序列长度cntrcntrcntr。答案是具有合并性的,对于pushuppushuppushup函数来说:答案除了左子区间里不下降串的个数,右子区间里不下降串的个数,还有合并后的答案。如果左子区间右端点的值小原创 2021-09-07 20:20:12 · 205 阅读 · 0 评论 -
CF1310A. Recommendations(贪心 优先队列 并查集)
给你n组数,每组数有a和b两个数,代表数量和让数量加1的花费,问让所有数量都不相同的最小代价。原创 2021-11-08 14:27:30 · 203 阅读 · 0 评论 -
2021年度训练联盟热身训练赛第一场——Early Orders(单调栈)
原题链接题意:给出一个长度为n的序列和k,要求选出一个最短的子序列使得该子序列包含1~k所有数并且字典序最小。思路:一开始也想到单调栈了,然后用deque模拟一直没过。大体思路就是:如果当前栈为空的话,直接入栈;如果不为空的话,考虑栈顶元素和当前元素的关系,如果栈顶元素大于当前元素并且栈顶元素在后面还有的话,就弹出栈顶元素,因为可以用后面的元素来替代这个元素。最后倒着把序列输出就可以了。代码:#include<bits/stdc++.h>using namespace st原创 2021-03-07 20:24:55 · 235 阅读 · 1 评论 -
P4137 Rmq Problem / mex(主席树)
主席树求mex原创 2021-08-19 20:33:37 · 139 阅读 · 0 评论 -
CF834D. The Bakery(线段树优化dp 决策单调性优化dp)
linkkkkk题意:将一个长度为 n 的序列分为 m段,使得总价值最大。一段区间的价值表示为区间内不同数字的个数。n≤35000,m≤50思路:考虑朴素的dpdpdp方程:dp[i][j]dp[i][j]dp[i][j]表示将前iii个数字分成jjj段得到的最大价值。转移为dp[i][j]=max(dp[k][j−1]+cnt[k+1][i])dp[i][j]=max(dp[k][j-1]+cnt[k+1][i])dp[i][j]=max(dp[k][j−1]+cnt[k+1][i])其中原创 2021-09-14 20:55:07 · 273 阅读 · 0 评论 -
Codeforces 1312E. Array Shrinking(区间DP 栈)
linkkk题意:给出一个长度为nnn的序列,对于相同相邻的两个数xxx可以替换为一个数x+1x+1x+1,问该序列的最短长度是多少。n<=500n<=500n<=500思路:看到数据范围不难想到是个区间dpdp[l][r]dp[l][r]dp[l][r]表示区间[l,r][l,r][l,r]能够合并成的最短序列长度。那么dp[l][r]=min(dp[l][k]+dp[k+1][r])dp[l][r]=min(dp[l][k]+dp[k+1][r])dp[l][r]=min原创 2021-10-19 19:55:36 · 369 阅读 · 0 评论 -
luoguP3958 [NOIP2017 提高组] 奶酪 (并查集)
linkkkk题意:现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0,奶酪的上表面为z=h。现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐 标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别 地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果 一个空洞与上表面相切或是相交,J原创 2021-09-09 17:35:06 · 152 阅读 · 0 评论 -
牛客 买礼物(链表 线段树)
// Problem: 买礼物// Contest: NowCoder// URL: https://ac.nowcoder.com/acm/contest/9983/E// Memory Limit: 524288 MB// Time Limit: 4000 ms// // Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>using namespace std;typedef long ..原创 2021-09-18 10:16:30 · 127 阅读 · 0 评论 -
数据结构实验报告——二叉树
#include<bits/stdc++.h>using namespace std;typedef char BElemType;typedef struct Node{ BElemType data; struct Node *LChild; struct Node *RChild;} BinNode,*BinTree;typedef BinTree QElemType;typedef struct QNode{ QElemType dat原创 2020-12-14 15:14:05 · 4457 阅读 · 0 评论 -
AtCoder Beginner Contest 215 F - Dist Max 2 (二分 单调队列)
原题链接题意:给出nnn个点对,定义每两个点之间的价值为min(xi−xj,yi−yj)min(x_i-x_j,y_i-y_j)min(xi−xj,yi−yj),求最大价值。思路:实际上就是要最小值最大化,答案明显是有单调性的,考虑是否能够二分答案来做。假设当前枚举到midmidmid,合法的条件就是min(xi−xj,yi−yj)>=midmin(x_i-x_j,y_i-y_j)>=midmin(xi−xj,yi−yj)>=mid,也就是说xi−xj>=m原创 2021-08-23 18:39:03 · 313 阅读 · 1 评论 -
AcWing 246. 区间最大公约数 (gcd性质 线段树)
线段树支持标记和标记的合并,值和值的合并,标记和值的合并。维护原序列的话,不知道打了区间修改的标记后gcd的变化。转化为差分序列后,单点修改区间查询gcd。时间复杂度nlogngcd(a,b)=gcd(a,b-a)const int maxn=500010;int n,m;ll w[maxn];struct node{ int l,r; ll sum,d;}tr[maxn*4];ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%..原创 2021-09-03 09:08:54 · 207 阅读 · 0 评论 -
CF960F. Pathwalks (树上二维LIS 线段树 动态开点树状数组)
linkkkk题意:给定 n 个点 m条边的有向图,可能不连通,可能有重边,也可能会有自环。求最长的路径(可以经过重复节点),使得这条路径的编号和权值都严格单调递增,其中编号指输入的顺序。路径的长度是指经过边的数量。思路1:要求编号也单调递增的话不妨按照输入顺序加边,之后只考虑让权值严格递增即可。设dp[i][w]dp[i][w]dp[i][w]表示以iii为结尾并且最后一条边权为www的最长路径长度。那么该状态可以从所有以iii为端点并且权值<w<w<w的边转移而来。即dp[原创 2021-09-14 15:24:25 · 214 阅读 · 0 评论 -
AtCoder Beginner Contest 221 E - LEQ(组合数学 树状数组)
linkkkk题意给出长度为nnn的序列aaa,问有多少种子序列满足首元素<=<=<=尾元素思路:假设现在已经确定了首元素的下标为xxx,尾元素的下标为yyy,那么方案数为2y−x−12^{y-x-1}2y−x−1。中间的每个元素都有选/不选两种可能性。问题转化成了∑1<=x<=y<=n2y−x−1[ax<=ay]\sum_{1<=x<=y<=n}2^{y-x-1}[a_x<=a_y]∑1<=x<=y<=n2y−原创 2021-10-12 16:16:41 · 246 阅读 · 0 评论 -
2019CCPC厦门站D. Zayin and Forest(树状数组 手写哈希表)
题意:定义B(x)B(x)B(x)表示xxx的二进制形式中111的个数,F(x)=min(y∣y>x&B(y)<=B(x))F(x)=min(y|y>x\&B(y)<=B(x))F(x)=min(y∣y>x&B(y)<=B(x))给出nnn,对于x<=nx<=nx<=n,如果F(x)<=nF(x)<=nF(x)<=n,那么xxx的父节点是F(x)F(x)F(x);否则,则xxx为根。两种操作,每次给出op,原创 2021-10-26 19:40:12 · 198 阅读 · 0 评论 -
数据结构实训五——排序算法应用
实验目的:(1)熟练掌握常用的内排序方法并加以比较。实验内容:利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。要求:(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有希尔排序、起泡排序、快速排序、选择排序、堆排序)。并把排序后的结果保存在不同的文件中。(2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。3.实验代码:#include<bits/stdc++.h>using namespace.原创 2020-12-23 13:04:05 · 931 阅读 · 1 评论 -
2021牛客国庆集训派对day1 J.Different Integers(莫队)
linkkkk题意:给出一个长度为nnn的序列,每次询问[1,l][1,l][1,l]和[r,n][r,n][r,n]里不同数的个数。思路:先求出[1,n][1,n][1,n]不同数的个数,每次减去[l+1,r−1][l+1,r-1][l+1,r−1]的贡献就好了,莫队维护。代码:// Problem: Different Integers// Contest: NowCoder// URL: https://ac.nowcoder.com/acm/contest/20322/J// Me原创 2021-10-02 10:28:33 · 149 阅读 · 0 评论 -
数据结构实训四——图的操作
1.实验目的:(1)掌握回溯算法;(2)掌握图的深度优先和广度优先搜索算法并用来解决实际问题;2. 实验内容:迷宫求解:以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。要求如下:(1)首先实现一个栈类型,利用回溯法求解迷宫路径(非递归程序)。求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。(2)建立图的存储结构,利用深度优先搜索,求得迷宫路径原创 2020-12-23 13:04:13 · 593 阅读 · 2 评论 -
AcWing 第 20 场周赛 3995. 最小的和(贪心 优先队列)
linkkkk题意:思路:最小化值肯定是贪心的想。对a,ba,ba,b的操作本质都是缩小差值,所以可以归到一类。将差值都计算出来,优先对差值大的进行操作,所以将差值都放入优先队列里,每次弹出最大的进行−1-1−1的操作。不能直接将最大的减去kkk,因为有可能还有次大的,比如9 89\ 89 8,应该先将999变成888,再将888变成777,再将第二个888变成777代码:// Problem: 最小的和// Contest: AcWing// URL: https原创 2021-10-10 09:31:50 · 122 阅读 · 0 评论 -
2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)热身赛 B.这是一道大水题(树状数组)
思路:代码:原创 2021-10-23 20:23:17 · 391 阅读 · 0 评论 -
PTA团体程序设计天梯赛-练习集 L3-010 是否完全二叉搜索树(顺序存储)
PTA团体程序设计天梯赛-练习集 L3-010 是否完全二叉搜索树原题链接思路:用奇技淫巧水过去了不想写链表存二叉树所以写了顺序存储。1.如果当前节点储存在a[i]a[i]a[i],那么他的左儿子储存在a[i∗2]a[i*2]a[i∗2],右儿子储存在a[i∗2+1]a[i*2+1]a[i∗2+1]。反推过去也是成立的,当前节点存储在a[i]a[i]a[i],他的父亲节点为a[i/2]a[i/2]a[i/2]。2.如何判断是完全二叉树:顺序存储里,如果该树和满二叉树的节点编号一一对应,该树就原创 2021-04-14 21:22:51 · 130 阅读 · 0 评论 -
upc2021个人训练赛第23场M: 紫罗兰(dsu)
#问题 M: 紫罗兰时间限制: 2 Sec 内存限制: 256 MB题目描述梦不知何时醒、何时灭,纵然天崩地裂,也见不得天日,原来都是青天白日下不敢细想的思量……那是从来无处表白的,那些生不得、死不得、忘不得也记不得的心。流年那样无理残忍,稍有踟蹰,它就偷梁换柱,叫人撕心裂肺,再难回头。在附中的小路旁种着许多紫罗兰,而我们的问题正是与这些紫罗兰有关。我们可以把附中里的道路系统抽象成一棵树,而所有的紫罗兰都被种植在树的节点上,并且每一个节点上的紫罗兰都是同一种品种。我们用一个数字来表示一原创 2021-07-23 17:11:15 · 183 阅读 · 0 评论 -
数据结构实验报告——线性表
顺序表#include<bits/stdc++.h>using namespace std;const int LISTSIZE=10;///顺序存储的最大元素数量const int maxn=100;///每次分配的元素个数#define ERROR -1#define OK 1int n,m;typedef int ElemType;struct List{ ElemType* elem; int len,listsize;};void output(原创 2020-12-14 15:14:26 · 3419 阅读 · 2 评论 -
2019CCPC秦皇岛HDU - 6736 F - Forest Program(dfs找环 组合数学)
linkkk题意:给出仙人掌图,问有多少种删边的方案使得该图变为一个森林。思路:跟上题类似。从每个环出发考虑方案数,长度为ttt的环的方案数为2t−12^t-12t−1,都不删的情况要减去,对于剩下的非环边,有删和不删两种选择,再乘上2x,x=2^{x},x=2x,x=非环边的数量。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;原创 2021-11-26 17:18:47 · 282 阅读 · 0 评论 -
CF711D-Directed Roads(组合数学 dfs找环)
合法的方案数=总方案数-不合法方案数原创 2021-11-26 15:57:58 · 235 阅读 · 0 评论 -
2019EC Final E-Flow(贪心 dfs)
linkkk题意:给出一张特殊的图,每次可以让一条边的容量+1+1+1,另一条边的容量−1-1−1,使得最大流最大,求最小操作次数。特殊在于:起点到终点的路径不相交且长度相同且路径上的点无重复思路:由于所有路径的长度都相同,所以最大流等于所有边的容量之和路径长度\frac{所有边的容量之和}{路径长度}路径长度所有边的容量之和。这里的最大流指的是每一层的流量,也就是所有路径第kkk条边的流量之和。对于路径的边来说,每条边都应该大于等于最大流,所以对于小于最大流的边来说,差值的累计就是代价原创 2021-11-16 17:59:35 · 147 阅读 · 0 评论