摘要: 有数组A[n],其元素值正好是1~n的一个排列。现在不知道具体的A,但已知m组条件,对于(x,y),有A[x]<A[y],问根据这m组条件能否唯一确定A,如果可以,输出Yes和A,否则输出No。 2<=n,m<=2e5; 1<=x[i],y[i]<=n 排列唯一有两个等价条件: bfs拓扑排序过程中 阅读全文
posted @ 2024-03-17 23:16 chenfy27 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 有n份文档和一台打印机,第i份文档在t[i]时刻进入打印区,停留d[i]时间后离开打印区,打印机可以在[t[i],t[i]+d[i]]范围内打印它,打印耗时不计,在打印完成后,需要1个单位时间恢复。问最多能打印多少份材料? 1<=n<=2e5; 1<=t[i],d[i]<=1e18 打印机每次应选择 阅读全文
posted @ 2024-03-17 19:15 chenfy27 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 给定n个字符串s[n]和字符串t,从中任选一对下标(i,j),要求i<=j,让s[i]与s[j]连起来得到一个新的串,要求由新串删除0个或多个字符可以得到t,问存在多少对满足条件的下标对? 1<=n<=5e5; 1<=len(s[i]),len(t)<=5e5 假设由字符串x能得到t的前缀长度为a, 阅读全文
posted @ 2024-03-17 18:17 chenfy27 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 给定数组a[n],有Q组操作,格式为: 1 p x,将a[p]修改为x; 2 l r,查询区间[l,r]内第2大元素的出现次数。 1<=n,q<=2e5; 1<=a[i]<=1e9 用线段树维护各个区间的最大及次大元素的出现次数,合并时最多只保留两条记录。 #include <bits/stdc++ 阅读全文
posted @ 2024-03-17 16:11 chenfy27 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 给定数组H[n],表示柱状图中各个柱子的高度,每个柱子彼此相邻,且宽度为1。求该柱状图中,能够勾勒出来的矩形的最大面积。 1<=n<=1e5; 0<=H[i]<=1e4 枚举每个柱子作为最短时能得到的最大矩形,尽量往两边延伸,取最小值即为答案。 class Solution { public: in 阅读全文
posted @ 2024-03-17 14:37 chenfy27 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 给定数组nums[n]和两个整数left,right,找出nums中连续非空、并且最大元素在[left,right]范围内的子数组,统计所有满足条件子数组的个数。 1<=n<=1e5; 0<=nums[i]<=1e9; 0<=left<=right<=1e9; 保证答案在int内 枚举每个元素作为最 阅读全文
posted @ 2024-03-17 14:29 chenfy27 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 给定数组nums[n]和整数threshold,找到长度为k的子数组,满足子数组中每个元素都大于threshold/k,返回满足条件的任意一个k即可,如不存在,返回-1。 1<=n<=1e5; 1<=nums[i],threshold<=1e9 子数组每个元素都大于t,也就是最小值大于t。对于固定的 阅读全文
posted @ 2024-03-17 14:13 chenfy27 阅读(5) 评论(0) 推荐(0) 编辑
摘要: 给定数组arr[n],求所有子数组中最小值的和,答案对1e9+7取模。 1<=n<=30000; 1<=arr[i]<=30000 考虑每个数作为最小值对应的子数组有多少个,计算对答案的贡献,而子数组的个数可以用单调栈来维护。数组元素可能相同,为了避免重复计数,用半开半闭区间。 class Solu 阅读全文
posted @ 2024-03-17 13:58 chenfy27 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 给定数组nums[n],子数组的范围指子数组中最大元素与最小元素的差值,返回nums中所有子数组的范围之和。子数组是数组的连续非空序列。 1<=n<=1000; -1e9<=nums[i]<=1e9 分别考虑每个元素作为最小和最大值的情况,统计作为最小值的次数,作为最大值的次数,这个可以用单调栈求出 阅读全文
posted @ 2024-03-17 11:03 chenfy27 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 给定数组A[n],如果i<j,并且A[i]<=A[j],则称坡的宽度为j-i。求A中坡的最大宽度,如果不存在,返回0。 2<=n<=50000; 0<=A[i]<=50000 二维偏序问题,先按元素值排序去掉一维,将符合条件的元素加入集合,然后在集合中根据第二维找最优答案。 class Soluti 阅读全文
posted @ 2024-03-17 10:30 chenfy27 阅读(4) 评论(0) 推荐(0) 编辑
摘要: n个能量发射站排成一行,第i个发射站的高度为H[i],并能向两边同时发射值为V[i]的能量,发射的能量只会被两边最近且比它高的发射站接收。求所有发射站里能接收的最大能量。 1<=n<=1e6; 1<=H[i]<=2e9; 1<=V[i]<=1e4 先用单调栈求出每个发射站发出的能量被谁接收,更新接收 阅读全文
posted @ 2024-03-17 00:47 chenfy27 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 给定数组a[n],对于每个元素a[i],求后面第1个比它大的元素的下标,如果不存在,则用0表示。 1<=n<=3e6; 1<=a[i]<=1e9 单调栈和单调队列都是类似的套路,先循环把容器中不符合条件的元素弹出,然后更新答案,再将元素入队。 #include <bits/stdc++.h> usi 阅读全文
posted @ 2024-03-17 00:33 chenfy27 阅读(15) 评论(0) 推荐(0) 编辑