![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL
陈末iiiiiiiiiiii
Retired
展开
-
AtCoder Beginner Contest 245 E 贪心 multiset 二分
题目你有n个巧克力和m个盒子,巧克力和盒子都是矩形,所以每个巧克力有对应的长宽,盒子也是同理。一个盒子只能装一个巧克力。问所有巧克力是否都能被装下。题解思路贪心策略。每个巧克力肯定是在大于等于自身长度的盒子中选择一个盒子。选择的盒子的宽度肯定要是大于等于自身宽度的最小的一个。不妨先满足一个条件,我们将盒子与巧克力一起按长度排序。逆向处理,从宽度最大的往前遍历,如果是盒子加入能选择的集合中,如果是巧克力,就二分出情况来。利用multiset就能处理二分宽度以及每个盒子选择完的删除还有重复情原创 2022-03-30 19:21:30 · 1023 阅读 · 0 评论 -
Codeforces Round #776 (Div. 3) E 二分 贪心 分类讨论 边界处理 multiset
题目现在 Dmitry 有一个会话,他必须通过 n 次考试。会议从第 1 天开始,持续 d 天。第i次考试将在ai(1≤ai≤d)那天进行,所有ai-都是不同的。样本,其中 n=3,d=12,a=[3,5,9]。橙色——考试日。第一次考试前,Dmitry 休息 2 天,第二次考试前休息 1 天,第三次考试前休息 3 天。对于课程安排,Dmitry 考虑了一个特殊值 μ——所有考试的考试前休息时间中的最小值。例如,对于上图,μ=1。换句话说,对于日程安排,他精确地计算了 n 个数字——他在考试 i-1原创 2022-03-09 18:03:50 · 231 阅读 · 0 评论 -
AcWing 1952. 对map 的 差分 + 离散化 利用map 超级暴力
题目题解思路一开始枚举温度 排序二分去了,仔细思考发现并不能保证另一边的情况。所以不能二分。N只有20万个。我们可以直接差分,即对每个温度区间的情况都差分。然后就能直接枚举出答案。这里能直接利用map来离散化。超级暴力。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long lon原创 2022-01-20 20:24:42 · 876 阅读 · 0 评论 -
4202. 穿过圆 bitset 位运算去重 STL
题目时限0.3s题解思路因为我们可以走任意路径到达,所以只需要穿过,包含这个点但是不包含另一个点的圆。可以预处理出每个点被几个圆包含了。这样然后进行对两个预处理的值去重操作即可。想set去了卡了好久。没想到是bitset来异或去重。属实巧妙。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define原创 2021-12-27 17:25:06 · 241 阅读 · 0 评论 -
4195. 线段覆盖 差分 离散化 遍历map
题目题解思路直接差分即可。我的做法被卡常了,这里利用map的自己排序的特性,节省时间。最后遍历map出答案。这题其实是简单题,但是我写的很复杂,甚至蠢到用哈希表去了,明明会大概率哈希错误(大于1e8)。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int ,int>#define ll long longusing n原创 2021-12-12 15:25:35 · 381 阅读 · 0 评论 -
AtCoder Beginner Contest 226 B set 小技巧 筛重复序列
题目给你N个序列每个序列长度为S每个序列中有a1 a2 …as要求不重复的序列有多少个。题解思路一开始还想hash来着,但是这样不如直接走一遍判断。实在想不出用什么log级别的方法去重,看了题解发现居然是set。去重建议先想想set,比较内置的红黑树是真的顶。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>原创 2021-11-16 11:46:14 · 944 阅读 · 2 评论 -
2021广东省大学生程序设计竞赛 A 优先队列 大顶堆 二分 思维
题目给你三个数n,m,k然后会根据n,m生成数列1×1,1×2,······,1×m2×1,2×2,······,2×m···n×1,n×2,······,n×m问你将这些数字中第k大的数字是多少?题解思路AC代码优先队列#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <原创 2021-10-17 19:21:40 · 98 阅读 · 0 评论 -
190. 字串变换 双向BFS substr函数
题目题解思路之前一直以为substr(i,j)是截取 下标i 到 j 的子字符串 。结果是 从 i 开始 长度为 j 的子字符串。对从初始值和答案两边同时搜索答案,在规定步数内 碰头的时候就是答案了。双向搜索可以节省 1e3的数量级。对字符串的操作就是可以走的每一步 。我们用unordered_map 存储走到这一步要的时间。这里使用引用为了对函数的复用,即两边同时走的时候有些操作是相同的。这里的每一步是指队列中和队头的时间相同的数同时扩展出的字符串。当这个字符串在反向的unorde原创 2021-10-12 15:24:03 · 69 阅读 · 0 评论 -
Educational Codeforces Round 115 (Rated for Div. 2) C 二分函数lower_bound upper_bound 的结合运用
题目Monocarp 有一个由 n 个整数组成的数组 a。让我们将 k 表示为这些元素的数学平均值(请注意,k 可能不是整数)。由 n 个元素组成的数组的数学平均值是元素的总和除以这些元素的数量(即总和除以 n)。Monocarp 想要从 a 中恰好删除两个元素,以便剩余 (n-2) 个元素的数学平均值仍然等于 k。您的任务是计算位置 [i,j] (i<j) 对的数量,如果删除这些位置上的元素,则剩余 (n-2) 个元素的数学平均值等于 k(即,它等于原始数组 a) 的 n 个元素的数学平均值原创 2021-10-11 20:56:21 · 141 阅读 · 0 评论 -
Codeforces Round #744 (Div. 3) E2 树状数组求正反逆序数 离散化的哈希冲突
题目事实上,问题 E1 和 E2 没有太多共同点。您可能应该将它们视为两个独立的问题。给定一个整数数组 a[1…n]=[a1,a2,…,an]。让我们考虑一个空的双端队列(双端队列)。 deque 是一种数据结构,支持在开头和结尾添加元素。因此,如果双端队列中当前有元素 [3,4,4],则在开头添加元素 1 将生成序列 [1,3,4,4],将相同元素添加到末尾将生成 [ 3,4,4,1]。数组的元素依次添加到最初为空的双端队列中,从 a1 开始,以 an 结束。在将每个元素添加到双端队列之前,您可以原创 2021-09-30 18:55:47 · 104 阅读 · 0 评论 -
Codeforces Round #744 (Div. 3) B rotate 函数 运用 暴力模拟
题目新一代外部存储器包含一个整数数组 a[1…n]=[a1,a2,…,an]。这种类型的内存不支持更改任意元素的值。相反,它允许您切出给定数组的任何段,以任何偏移量循环移动(旋转)它并将其插入回同一位置。从技术上讲,每个循环移位由两个连续的动作组成:您可以选择任意索引 l 和 r (1≤l<r≤n) 作为线段的边界。然后将段 a[l…r] 替换为向左循环移位任意偏移 d。循环移位的概念也可以用以下关系来解释:序列[1,4,1,3]是序列[3,1,4,1]向左循环移位1,序列 [4,1,3,1原创 2021-09-29 17:26:41 · 148 阅读 · 0 评论 -
237. 程序自动分析 并查集 + 离散化
题目题解思路数据范围太大 开不了那么大的数组(最大1e8) 所以我们进行离散化使用<unordered_map>进行离散实现 O(1)的查找(推荐map是logn级别的查找)可以先对相等的进行合并再对不相等的进行判断因为定义相等是不会影响后面不相等的情况的 。因为如果相等不对 我们假定他正确 不相等肯定不对 依然可以推出答案 不影响最后的答案而且这题要开两倍空间 (WA了2次)两个数可能全部都不一样AC代码#include <iostream>#inclu原创 2021-09-27 19:50:33 · 74 阅读 · 0 评论 -
106. 动态中位数 对顶堆 大根堆和小根堆 优先队列
题目题解思路 priority_queue <int> q1; //默认 大顶堆 priority_queue <int,vector<int>,greater<int> > q2 ; //小顶堆 只需要让小顶堆的所有元素都大于等于大顶堆 并且 大顶堆的元素不超过 小顶堆加1 因为我们在小顶堆顶取到中位数 。每次照着加入元素 后面再对元素的归属做调整即可。这题卡输出属实恶心。AC代码#include &原创 2021-09-26 17:06:06 · 97 阅读 · 0 评论 -
AcWing 3816. 移动元素 前缀和 STL 哈希表 unordered_set
题目题解思路特判如果总和为奇数将无法分割。考虑存在某个前缀和减去总和的一半等于之前前缀和加上的某个元素,判断元素是否存在用哈希表。如果不用移动元素,就考虑存在某个前缀和减去总和的一半等于0unordered_set因为多的元素可能在前段也可能在后段,前缀和后缀都有可能。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include原创 2021-09-15 16:14:14 · 97 阅读 · 0 评论 -
Codeforces Round #725 (Div. 3) C题 Number of Pairs STL二分函数
题目题解思路利用STL里的二分函数。(自己写的疯狂WA)取i+1到n中小于等于r-a[i]的最大的数的下标upper_bound(a+i+1,a+n+1,r-a[i])-a-i-1;取i+1到n中大于等于l-a[i]的最大的数的下标lower_bound(a+i+1,a+n+1,l-a[i])-a-i-1;这样时间复杂度为nlogn符合题目的10e5.纠结了好久。AC代码#include <iostream>#include <cstdio>#incl原创 2021-07-01 18:07:01 · 139 阅读 · 0 评论 -
HDU - 1571 队列的运用 队列遍历小技巧 STL
题目链接题解思路用邻接矩阵存图,用队列来存上车的人,每次下车判断非空,判断有无一起下车的人(这里就需要遍历队列了),人满时不能入队,用指针记录车的位置,每次加上答案即可。遍历队列小技巧设置遍历次数(必须是常数)为原来的队列大小,用头入队尾再出队,这样遍历一遍头又变成尾。妙啊 tmp = q.front(); q.pop(); int k = q.size(); for原创 2021-05-21 17:39:16 · 209 阅读 · 0 评论 -
HDU 2072 单词数 set去重 C++的输入输出控制类 istringstream
题目地址链接题解思路很明显可以用string的set来去重,直接输出size就可以。先用gets或者getline来输入一行 怎么将一行的信息快速处理呢?也可以用find寻找里面的空格 这里要讲的是 istringstream函数举个例子 string str="i am a boy"; istringstream is(str); string s; while(is>>s) {原创 2021-05-04 15:42:24 · 123 阅读 · 0 评论 -
蓝桥杯 平面切分 数论 欧拉定理 平面个数问题 STLset 写了好久
问题描述平面上有 N条直线,其中第 i条直线是 y = Ai*x + B。请计算这些直线将平面分成了几个部分。输入格式第一行包含一个整数N。以下N行,每行包含两个整数 Ai, Bi。31 12 23 3输出格式6一个整数代表答案。题解思路根据欧拉定理有结论 每增加一条直线,对平面数增加的贡献值,是其与先前直线的交点数(不包括与已有交点重合的点)+1 这题两处用到了集合去重,一开始用集合加pair存储数据,然后将数据放到数组里对加入的每条直线与之前的之前的直线求交点并且去重,然后累原创 2021-04-15 17:37:23 · 234 阅读 · 0 评论 -
UVA10954 Add All 类似合并果子 STL优先队列(创建和应用) 贪心大法
题目题目地址合并两个数要消耗他们的和,我们要把所有数合并,要求消耗最小。题解思想非常明显的贪心,但由于不熟练STL最开始我只想着排序一次做,这样忽略了每次的最小值可能会更新,这样就导致的第一次的WA。优先队列的好处在于代码量小,而且每次都会更新队列。这样我们取一个由小到大的优先队列,每次取出第一 二个相加再将其之和入队即可。 再用一个变量加上每次合并的值最后输出即可。创建优先队列操作(注意第二个操作的大于号前要空格)priority_queue<int> a; //通过操作,按照元原创 2021-04-05 16:01:32 · 70 阅读 · 0 评论 -
HDU 2094小明和乒乓球 迷惑并查集 STL set 集合的妙用
题目小明正在看乒乓球比赛,比赛规则是每场比赛两个人对打,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。输入含有一些选手群(多组输入),每群选手都以一个整数n(n<1000)开头,后跟n对选手的比原创 2021-03-29 23:50:03 · 100 阅读 · 0 评论