![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法竞赛进阶指南
题解
天才夏洛克
这个作者很懒,什么都没留下…
展开
-
AcWing120 防线
二分练习题,因为一开始知道是二分,就比较好写了,输入统计一下区间的最大最小值,作为二分的区间,然后考虑单调性哪里来,可以发现是前缀和,本题就是找前缀和第一个为奇数的点,因为题目里面说了最多只会出现一个奇数,那么这个奇数出现之前,前缀和都是偶数,出现之后都是奇数,那么就可以转化为最小化的二分,找最小的前缀和是奇数的下标即可,然后需要注意的是区间右端点要加一,因为可能奇数不存在,那么最后搜到的就是越界的下标,也就是右端点加一,然后本题的数据可能超过int,所以我很多地方都写成了longlong,改成int之后发原创 2021-07-07 19:51:58 · 78 阅读 · 0 评论 -
P2859 [USACO06FEB]Stall Reservations S
难度:5这道题的贪心策略是按照左端点进行排序,右端点任意,目前还没有想到证明,然后就是按照贪心的来写,需要用优先队列来优化一下,来维护一个什么数据,这个要想明白,然后就是一开始队列里面是没有数据的,第一个入队的要特殊处理。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace原创 2021-06-07 17:44:02 · 76 阅读 · 0 评论 -
UVA1193 Radar Installation
难度:5难得一道不用看解析直接10分钟解决的题,这道题就是区间选点问题,选择尽可能少的点使得所有区间都有点选了,思路也比较自然,就是题目给了半径,那么以被探测点为圆心,以雷达半径做圆,会交x轴一段距离,得到一个区间,那么选择雷达就是这个区间里面选择一个点,接下来的就很明显了,只不过我们得到的是端点为实数的区间,不是整数而已,然后无解的判断也很简单,那就是输入点的y坐标大于d了,只要有一个大于,那么就不可能有雷达能探测到它了,#include <bits/stdc++.h>#define原创 2021-06-07 18:25:37 · 65 阅读 · 0 评论 -
P1842 [USACO05NOV]奶牛玩杂技
难度:3这道题只用贪心就能做,先排序,用的就是邻项分析法,先假设两个,然后看谁排在前面压扁指数更小,那就把谁放在前面,然后让求这个最大压扁指数,扫描一遍就可以了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;ty原创 2021-06-03 16:38:58 · 139 阅读 · 0 评论 -
poj1050 To The Max
这个是二维的矩阵,用降维,可以按照一维的序列来做,其实数据规模太小,可以暴力,但是学习一下降维的技巧,那就是每一行当前的数据都是累加了上面所有行的数据,就是前缀和,然后列上面按照一维的序列来做就可以了,#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <vector>#include <set>#include &l原创 2021-06-08 01:09:57 · 59 阅读 · 0 评论 -
UVA1316 Supermarket
#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> pa;const int maxn = 1e4原创 2021-07-06 13:36:59 · 66 阅读 · 0 评论 -
SP4354 TWINSNOW - Snowflakes
难度:5知识点:散列这个题一开始犯了一个低级错误,就是没有输入n,找了好久,然后就是主要思路,首先就是散列函数的设计,这个我参考的进阶指南上面的,用和与乘积的和作为散列的下标,然后就是对于两个雪花,判断是否相同的时候不要忘记将第二片雪花复制一个然后反转一下,因为顺时针逆时针相同的雪花是同一个,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x)原创 2021-07-06 11:46:10 · 100 阅读 · 0 评论 -
AcWing136 邻值查找
这道题有两个方法,一个是链表一个是平衡树,这里先用平衡树也就是set做的,用set可以很容易的找到一个数的前驱和后继,因为题目里面说了对于当前元素,从下标比它小的里面找满足题意的答案,所以这道题相当于是动态的过程,按照输入顺序,一个数只从先于它输入的数里面找前驱或者后继,用的是迭代器++,–的方法,找到之后直接比较两个数对应的答案输出即可#include <bits/stdc++.h>#define fi first#define se second#define pb push_ba原创 2021-07-05 13:04:08 · 125 阅读 · 0 评论