基本算法
40
天才夏洛克
这个作者很懒,什么都没留下…
展开
-
P1226 【模板】快速幂||取余运算
难度:2 快速幂,时间复杂度log2b,求a的b次方对p取余,将b展开成2进制完成的,还有如何取b二进制下最低位,以及递推公式, #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<in原创 2021-05-26 16:50:43 · 65 阅读 · 0 评论 -
poj1995 Raising Modulo Numbers
poj非常不友好的地方就是现在还用不了万能头, 这道题是快速幂的模板题,基本上就是模板题,然后写这道题的时候顺便看了看模运算的一些规则, #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <vector> #include <set> #include <string> #include <map>原创 2021-06-06 19:18:56 · 74 阅读 · 0 评论 -
AcWing90 64位整数乘法
64位整数的乘法,还是前面一道题的思想,书上还有一种解法没有看, #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, i原创 2021-05-26 17:16:36 · 33 阅读 · 0 评论 -
P2114 [NOI2014] 起床困难综合症
难度:4 第一道位运算的题,还不是很熟悉,位运算主要有四种外加左移右移,然后一个特点是不进位,当前点的计算结果就改变当前位,不会影响其它的位,所以可以按照位依次来找,然后就是判断什么情况下,当前点可以选1,这个值这道题的难点, #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 14:36:38 · 78 阅读 · 0 评论 -
AcWing92 递归实现指数型枚举
递归实现指数型枚举,也就是2的n次方,注意回溯时还原现场, #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&原创 2021-05-26 14:15:36 · 34 阅读 · 0 评论 -
AcWing93 递归实现组合型枚举
递归实现组合型枚举,就是从n里面选出来m个数,输出所有的情况,属于前面指数型枚举问题的子集,只需要加一个剪枝的条件,指数型问题时枚举n个数1到n的长度的子集,而这个是只要枚举长度为m的子集, #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 lon原创 2021-05-26 14:27:18 · 35 阅读 · 0 评论 -
AcWing94 递归实现排列型枚举
排列型枚举,输出n的全排列,用的时刘汝佳的书上的方法, #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>原创 2021-05-26 14:36:32 · 41 阅读 · 0 评论 -
AcWing95 费解的开关
难度感觉是3,然后这道题的标准做法应该是递推,首先我们知道枚举一行可能的按开关的情况是2的5次方,每盏灯有按或者不按,其实也就是指数型枚举或者枚举子集, 为什么说枚举一行呢,因为枚举一行有32种情况,枚举第一行,那么每种情况之后,第一行的按开关的情况也就随之确定,第一行的灯的开关情况也就是随之确定,然后就是按照第一行递推下面的4行,由第一行某个位置的灯的开关,第二行只能按那个下面的开关,所以递推4次,由1234来递推2345行,递推完之后,也就是第五行都摁过一遍了,摁完第五行,前面4行也都是开着的了,然后就原创 2021-05-27 13:53:40 · 136 阅读 · 0 评论 -
P2280 [HNOI2003]激光炸弹
难度:4 二维前缀和和容斥原理,首先先将题目的意思转化一下,下标的范围是0到5000,那么我们转化为1到5001,这样边界的0一开始定义数组的时候就存在了,不用特殊处理, 然后是m,题目的意思是正方形的边长,我们抽象为x和y方向上能访问的点数,如果是1,那就是只能访问本点,向右为零向下为零,如果是2,那就是包括本点,x方向上只能访问两个点,y方向上同理,这种处理思路貌似和进阶指南上的不一样,那个没看, 然后就是先求前缀和,公式就不写了,但是由于空间比较紧,所以怎么用一个数组来求前缀和,这个要想明白,然后就是原创 2021-05-27 15:57:24 · 57 阅读 · 0 评论 -
P4552 [Poetize6] IncDec Sequence
难度:5 因为是对区间上所有数的操作,所以很自然想到了差分,求出差分序列,然后就把修改一个区间上的数的操作转化为修改两个值,题目说让序列所有数相等,那么就等价于操作过后让差分序列的第一个数为一个值,然后2到n为0,题目说问有几种可能的情况,就是问第一个数的值可能有多少种情况, 上面三个等价完了,就把原序列区间上的操作转化到了差分序列上,对于差分序列一次改变两个数,那么可能的有四种情况,又因为差分序列可以分为3段,1,2到n,n+1,所有排列组合有四种情况,列出来这四种情况, 首先是问操作最少,然后在操作最少原创 2021-06-03 18:58:10 · 48 阅读 · 0 评论 -
P2879 [USACO07JAN]Tallest Cow S
难度:4 初看觉得可能很难,但是不然,题目问的是每头牛可能的最大身高,只要满足题目里面的条件就行了,然后就是满足条件下的最大身高,然后思路就是设置一个数组,输入的牛是a和b,然后我就把a+1到b-1这个区间都减一,意思就是相比于两边的牛,至少矮了1,所以最后p位置最高处的牛一定为0,然后输出h+数组值,就得到了每头牛可能的最大身高, 然后可以优化的操作是对区间减1,有这样一个结论,对闭区间a到b,加上一个数,则a处加上x,b+1处减x,然后求前缀和即可, 然后就是本题的一个坑点,同样的一对关系可能被多次输入原创 2021-05-27 19:08:47 · 85 阅读 · 0 评论 -
CF670C Cinema
难度:4 这道题是离散化的例题,题目里面给的数字是10的9次方范围内的,但是实际上个数只有10的6次方级别甚至更少,所以使用离散化,下面采用了两种方式,一种是map映射,时间是1.6s,然后学习了书上的离散化写法,降到了0.234s,时间复杂度的进步是可观的, 总结一下整数离散化的步骤,首先是把所有数据存在一起,然后排序,然后把数据去重存到新的数组里面,然后就是把老数组里面的数据换成新数组的下标,这一步是用stl里面的二分来实现的, map代码 #include <bits/stdc++.h>原创 2021-05-31 18:11:09 · 102 阅读 · 0 评论 -
AcWing104 货仓选址
中位数的简单应用,通过简单的分析得到,货仓需要建造在中位数的位置上, #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,原创 2021-05-31 18:46:31 · 59 阅读 · 0 评论 -
AcWing106 动态中位数
这道题是动态维护中位数,用的对顶堆的做法,然后我还不知道为啥这么写是对的,完全就是把书上的文字翻译成程序, #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; t原创 2021-05-31 22:15:04 · 47 阅读 · 0 评论 -
UVA10810 Ultra-QuickSort
难度:5 感觉难度有点虚高,这是归并排序的应用,求逆序对,因为诸如冒泡排序此类的排序,都是交换相邻的两个数,问几次交换排序能完成,就是问有多少个逆序对,而逆序对的统计可以在合并两个序列的时候顺便统计,最后需要注意一点逆序对的个数可能超过int, #include <bits/stdc++.h> #define fi first #define se second #define pb push_back #define all(x) (x).begin(), (x).end() using原创 2021-05-31 15:36:01 · 71 阅读 · 0 评论 -
AcWing108 奇数码问题
这是数码问题的一个特殊情况,n为奇数的正方形,然后有一个元素是0,其余的都是正数,给定两个数码游戏的局面,问是否存在一种移动空格的放实,使其中一个局面可以变化成另外一个局面, 这个问题是问你有没有解,不是问解是什么,当且仅当,两个局面转化成的序列(这里的序列是指去掉零的,然后排列的)逆序对的个数奇偶性相同,这个问题有解,所以就把这个问题转化为了求逆序对的个数, 然后这个只是奇数码问题,还是正方形的n×n,还有更一般的情况,n×m,然后n和m的奇偶性任意,因此还有更多的结论 #include <bits原创 2021-05-31 16:25:47 · 54 阅读 · 0 评论 -
P2887 [USACO07NOV]Sunscreen G
难度:4 区间贪心问题,每头牛都是一个区间,一开始,容易产生两种思路,究竟是按照区间左端点从小到大排序还是按照区间又端点从小到大排序, 究竟怎么排序呢,书上给了一种分析方法,假如对前一头牛x和y都可以用(这里已经假设x<y),那么对后一头牛除了x不可用y可用这种情况没有,有且只有其余三种情况,那么这种排序方法就是正确的,做这类问题的时候将两种排序会产生的区间画出来分析一下就知道要选择哪种排序方法了, #include <bits/stdc++.h> #define fi first #d原创 2021-06-01 17:17:43 · 60 阅读 · 0 评论