![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基本算法
QingQingDE23
这个作者很懒,什么都没留下…
展开
-
AcWing 3188. manacher算法
马拉车算法,统计字符串中最长的回文子串的数量。原创 2022-09-06 20:46:46 · 47 阅读 · 0 评论 -
AcWing 345. 牛站 题解(floyd的性质、倍增)
AcWing 345. 牛站解题思路:本体所用的floyd和求最短路的floyd本质不同,虽然都是三重循环,但本题中的d[k][i]j]表示的是由i~j经过k条边的最短距离,在确定这个之后,进一步推d[a+b][i][j] = min(d[a+b][i][j],d[a][i]k] + d[b][k][j]),由于d[a][i]k] 和 d[b][k][j]之间不相互影响,所以可以联想出由快速幂得到最短距离大老远题解...原创 2022-07-03 15:54:26 · 143 阅读 · 0 评论 -
AcWing 340. 通信线路 题解(二分+双端队列BFS求最短路)
AcWing 340. 通信线路y总说有noip提高组水平,确实题意转换比较难,想找到解法也难,希望自己再努力努力某一天可以只凭自己写出这种水平的题解题思路:二分+双端队列BFS求最短路,思维转换比较难,几个思维的拐弯点在:①找合适的小于k的值x,用二分。②在判断x是否合适时,可以用双端队列找最短路...原创 2022-06-22 17:49:37 · 258 阅读 · 0 评论 -
AcWing 1210 连号区间数 题解(区间 蓝桥杯)
原题这题对区间的考虑方法值得学习,更新最大值和最小值的方法也应该记住#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N];int n;int ans;int main(){ cin>>n; for(int i = 0; i < n; i ++ ) cin>>a[i]; for(int i = 0; i < n; i ++ ){原创 2022-03-17 21:27:09 · 195 阅读 · 0 评论 -
AcWing 3370 牛年 题解(模拟 春季每日一题)
原题#include<bits/stdc++.h>using namespace std;int n;map<string, int>mp;string t[13] = {"Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig", "Rat"}; //存储生肖int main(){ cin>>n;原创 2022-03-16 00:22:11 · 189 阅读 · 0 评论 -
AcWing 1230 K倍区间 题解(前缀和 蓝桥杯)
原题这题处理区间差的方法很有用,好好记住#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;typedef long long ll;ll s[N];ll n, k;ll cnt[N];//记录余数为x的数有几个,余数相同的数大减小%k=0,就代表这一对i、j可以组成一个和是k的倍数的区间 int main(){ cin>>n>>k; for(int i =原创 2022-03-15 21:39:21 · 210 阅读 · 0 评论 -
AcWing 1227. 分巧克力 题解(二分 蓝桥杯)
原题①这道题学到的大切小的方法很有用,要记住,②二分的知识又增加了一些#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, k;int h[N], w[N];bool check(int mid){ int x = 0;//记录最终分得的巧克力数 for(int i = 1; i <= n; i ++ ){//遍历每块大巧克力 //这种切块方式很有用,可以记住原创 2022-03-15 12:00:32 · 130 阅读 · 0 评论 -
AcWing 1209 带分数 题解 (递推 蓝桥杯)
原题#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 20;int n;bool backup[N], st[N];int ans;bool check(int a, int c){ ll b = n * (ll)c - a * c; if(!a || !b || !c) return false; memcpy(backup, st, sizeof st原创 2022-03-13 21:02:25 · 268 阅读 · 0 评论 -
AcWing 1208 翻硬币 题解(递推 蓝桥杯)
原题 #include<bits/stdc++.h>using namespace std;string be, en;int n;int ans;void turn(int a){ if(be[a] == '*') be[a] = 'o'; else be[a] = '*'; }int main(){ cin>>be; cin>>en; for(int i = 0; i < be.size(); i ++ ){ if(原创 2022-03-13 21:50:55 · 209 阅读 · 0 评论 -
AcWing 116 飞行员兄弟 题解(递归 蓝桥杯)
原题位运算的妙用#include<bits/stdc++.h>using namespace std;#define x first#define y secondtypedef pair<int, int>PII;char g[4][4], back[4][4];int get(int a, int b){//返回位置的编号 return a * 4 + b;}void turn_one(int a, int b){//状态转换 if(g[a原创 2022-03-11 21:55:09 · 182 阅读 · 0 评论 -
AcWing 93 递归实现组合型枚举 题解(递归 蓝桥杯)
原题递归#include<bits/stdc++.h>using namespace std;int n, m;int way[15];void dfs(int u, int start){//u记录当前已经枚举几位数,start记录当前枚举到的那个数 if(u + n - start < m) return ; if(u == m + 1){ for(int i = 1; i <= m; i ++ ) cout<<way[i]<<原创 2022-03-11 20:30:18 · 137 阅读 · 0 评论 -
AcWing 717 简单斐波那契 代码(递归 蓝桥杯)
原题简单递归#include<bits/stdc++.h>using namespace std;int a[50];void init(){ a[1] = 0; a[2] = 1; for(int i = 3; i <= 50; i ++ ){ a[i] = a[i - 1] + a[i - 2]; }}int main(){ init(); int n; cin>>n; for(int i = 1; i <= n; i +原创 2022-03-11 11:15:33 · 71 阅读 · 0 评论 -
AcWing 95 费解的开关 题解(递归 蓝桥杯)
原题传送门#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 6;char g[N][N], backup[N][N];int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};void turn(int x, int y原创 2022-03-11 00:27:42 · 211 阅读 · 1 评论 -
AcWing 92 递归实现指数型枚举 题解(递归 蓝桥杯)
原题传送门dfs模板题#include<bits/stdc++.h>using namespace std;const int N = 16;int n;int st[N];void dfs(int u){//u记录当前枚举了多少位了 if(u > n){ for(int i = 1; i <= n; i ++ ){ if(st[i] == 1){ cout<<i<<" ";原创 2022-03-10 21:21:52 · 99 阅读 · 0 评论 -
AcWing 94. 递归实现排列型枚举 题解(递归 蓝桥杯)
原题传送门#include<bits/stdc++.h>using namespace std;const int N = 10;int n;vector<int>ve;void dfs(int u, int state){//u表示已经遍历了几位,state表示我们当前已经枚举到的数 if(u == n){ for(int i = 0; i < n; i ++ ) cout<<ve[i]<<" "; cout<&l原创 2022-03-10 21:08:48 · 533 阅读 · 0 评论 -
AcWing 火车出栈问题 题解(栈 (可能有吧)+ 欧拉筛 + 卡特兰数 + 质因数分解 + 思路)
一道题花了五六个小时,可能是我太菜了,学到了好多东西(欧拉筛、卡特兰数、质因数分解)解题思路:火车进出站–合法的加减号排列–通过合法的路径到达(n, n)–推出公式–利用质因数分解实现超级大数的快速运算–打王者去了,溜了溜了原题链接:https://www.acwing.com/problem/content/description/132/(AcWing可以看自己没过的每一个样例,个人觉得是个练题神器)思路讲解链接(yxc yyds):https://www.acwing.com/video/66原创 2021-08-27 22:54:36 · 103 阅读 · 0 评论 -
牛客 803 区间合并 题解(贪心)
原题链接:https://www.acwing.com/problem/content/805/模糊的记得我见过这个题,但清楚地记得自己当时没弄明白,并且没有补题,不过这次算是弄懂了#include<iostream>#include<bits/stdc++.h>using namespace std;typedef pair<int, int>PII;void merge(vector<PII> &segs){ vector<原创 2021-08-26 15:20:20 · 144 阅读 · 1 评论 -
牛客 起床困难综合征 题解(位运算)
#include<iostream>#include<bits/stdc++.h>using namespace std;pair<string, int> a[100005];int n;int cal(int bit, int now){ for(int i = 0; i < n; i ++ ){ int x = a[i].second >> bit & 1;//判断这一位应该进行数 if(a[i].first ==原创 2021-08-26 13:15:26 · 71 阅读 · 0 评论 -
AcWing 802 区间和 (离散化)
原题链接:https://www.acwing.com/problem/content/804/解题思路:这题用的离散化很想hash,都是将一个很长很长的数组映射到一个短一点的数组,只是映射方法不同。离散化是通过建立新数组,将原数组的下标从小到大依次排入新数组,映射出的新数组每个位置都有元素,原数组有很多空位,这样就可以节约很大的空间和运算时间(主要)#include<iostream>#include<vector>#include<algorithm>us原创 2021-08-26 13:07:09 · 106 阅读 · 0 评论 -
牛客 最短Hamilton路径 题解 (位运算/最短路径)
原题链接:https://ac.nowcoder.com/acm/contest/996/D解题思路:f[][]数组的第一维用二进制表示n,这个二进制数的长度是n,当他是1时,代表这个点被遍历过,可以用来更新最短距离,第二维表示当前遍历到第几个点,#include<iostream>#include<cstring>using namespace std;int f[1<<20][21], w[21][21];int n;int main(){ s原创 2021-08-25 23:11:46 · 130 阅读 · 0 评论 -
牛客 64位整数乘法 题解 (快速幂/位运算)
#include<iostream>using namespace std;typedef long long ll;ll lower(ll a, ll b, ll p){ ll ans = 0; for( ; b; b >>= 1){ if(b & 1) ans = (ans + a) % p; a = a * 2 % p; } return ans;}int main(){ ll a, b, p; cin>>a>.原创 2021-08-25 20:57:47 · 67 阅读 · 0 评论 -
牛客 a^b 题解 (位运算/快速幂)
原题链接:https://ac.nowcoder.com/acm/contest/996/A算法:快速幂 + 位运算1、题中用到的位运算不难(《算法指南》把这个题分到位运算就离谱)位运算:①b & 1,判断b的奇偶性,如果是奇数,这个表达式会返回1,如果是偶数会返回0,这个操作比直接%2好像是快一点(我也没验证)②b >> 1把二进制的b所有数右移一位,相当于/2(但比/2快)快速幂:这题真正难搞懂的是快速幂这一部分,我想了几个小时才弄明白根据幼儿园的数学基础,可以知道:原创 2021-08-25 18:53:04 · 291 阅读 · 0 评论 -
AcWing 801 二进制中1的个数 题解(位运算)
#include<iostream>using namespace std;int lowbit(int x){ return x & -x;}int main(){ int n; cin>>n; while(n -- ){ int x, res = 0; cin>>x; while(lowbit(x)){ x -= lowbit(x); res ++ ; } cout<<res<<原创 2021-08-25 15:34:11 · 40 阅读 · 0 评论 -
AcWing 799最长不重复字序列 (双指针算法)
原题链接:https://www.acwing.com/problem/content/description/801/解题思路:双指针算法,利用s数组记录当前[j, i]序列里的数字出现的个数, 如果某次遍历发现新加入的a[i]累计出现的个数大于1,就让j向右移动,直到s[a[i]]<=1,之后记录当前序列的长度(i - j + 1), 筛选出最大的序列长度#include<iostream>using namespace std;const int N = 1e5 + 10原创 2021-08-25 13:33:49 · 38 阅读 · 0 评论 -
牛客 Tallest Cow 题解 (差分)
原题链接:https://ac.nowcoder.com/acm/contest/999/C解题思路:利用差分数组, 如果A牛和B牛可以互相看见,那么[A, B]之间所有牛的身高应该减一, 这时候用差分数组记录,当所有关系都记录之后,从第一头牛开始,挨个遍历每头牛的身高和最高的牛的差距,最后输出注意:用map检验这个关系是否出现过make_pair就是将(a, b)结合成一个数据,相当于建立一个新的结构体,里面有a, b#include<iostream>#include<map原创 2021-08-24 23:49:34 · 133 阅读 · 0 评论 -
牛客 IncDec Sequence 题解 (差分 + 思路)
原题链接:https://ac.nowcoder.com/acm/contest/999/B这是一道很考验思路的题,明白之后很简单,但这种解题思路挺难想的解题思路:①这题妙在利用差分修改区间值,以达到数列所有数都相同的目的②差分的性质:对于一个给定的数列A,它的差分数列B定义为, B[1]=A[1], B[i]=Ai−A[i − 1] (2<=i<=n), B[1]=A[1], B[i]=Ai−A[i − 1] (2<=i<=n)这里只说性质,也就是把序列A的区间[L,R]原创 2021-08-24 22:33:43 · 102 阅读 · 0 评论 -
牛客 激光炸弹 题解 (二维前缀和)
原题链接:https://ac.nowcoder.com/acm/contest/999/A解题思路:利用s[][]数组储存每个位置上的值,之后对s数组进行二维前缀和数组的操作,使s[i][j]记录的值是以x = i, y = j和坐标轴围成的区域的价值总和,之后遍历每一块边长是R的正方形内部的s[][]的值,选出最大值注意:r的值可能大于5001, 导致过样例时直接爆掉,所以先令r = min(5001, r);对二维前缀和操作不太懂的可以看一下:https://blog.csdn.net/qiao原创 2021-08-24 19:29:29 · 215 阅读 · 0 评论 -
AcWing 798 差分矩阵 题解 (二维差分 模板)
#include<iostream>using namespace std;const int N = 1005;int a[N][N], b[N][N];int n, m, q;int x1, y1, x2, y2, c;int insert(int x1, int y1, int x2, int y2,int c){ b[x1][y1] += c; b[x1][y2 + 1] -= c; b[x2 + 1][y1] -= c; b[x2 + 1][y2 + 1]原创 2021-08-24 16:05:14 · 90 阅读 · 0 评论 -
AcWing 797 差分 题解 (一维差分 模板)
#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N], b[N];int n, m, l, r, c;int insert(int l, int r, int c){ b[l] += c; b[r + 1] -= c;}int main(){ scanf("%d%d", &n, &m); for(int i = 1; i<= n;i ++ ){ sc原创 2021-08-24 15:09:40 · 87 阅读 · 0 评论 -
AcWing 796 子矩阵的和 题解(二位前缀和 模板)
#include<iostream>using namespace std;const int N = 1010;int a[N][N], s[N][N];int n, m, q;int x1, x2, y1, y2;int main(){ scanf("%d%d%d", &n, &m, &q); for(int i = 1; i <= n; i ++ ){ for(int j = 1; j <= m; j ++ ){ sc原创 2021-08-24 12:06:54 · 67 阅读 · 0 评论 -
AcWing 795 前缀和 题解(一维前缀和 模板)
#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N], s[N];int n, m;int l, r;int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++ ){ scanf("%d", &a[i]); s[i] = s[i - 1] + a[i]; } while(m --原创 2021-08-24 11:03:16 · 61 阅读 · 0 评论 -
AcWing 高精度乘法 题解(大整数乘法 模板)
#include<iostream>#include<vector>#include<cstring>using namespace std;vector<int> mul(vector<int> &A, int b){ int t = 0; vector<int>C; for(int i = 0; i < A.size() || t; i ++ ){ if(i < A.size()) t +原创 2021-08-23 17:37:13 · 75 阅读 · 0 评论 -
AcWing 高精度除法 题解 (大整数除法 模板)
#include<iostream>#include<vector>#include<cstring>#include<algorithm>using namespace std;vector<int> div(vector<int> &A, int b, int &r){ r = 0; vector<int> C; for(int i = A.size() - 1; i >=原创 2021-08-23 17:35:43 · 143 阅读 · 0 评论 -
AcWing 792 高精度减法 题解(大整数减法 模板)
简简单单的大整数减法都能写错,还看半天看不出来,第四遍写了竟然还有错的地方,我还是太菜了#include<iostream>#include<vector>#include<cstring>using namespace std;bool cmp(vector<int> &A, vector<int> &B){ if(A.size() != B.size()) return A.size() > B.size(原创 2021-08-23 16:14:33 · 80 阅读 · 0 评论 -
AcWing 高精度加法 题解 (大整数加法 模板)
#include<iostream>#include<vector>using namespace std;const int N = 1e5 + 10;vector<int> add(vector<int> &A, vector<int> &B){ vector<int>C; int t = 0; for(int i = 0; i < A.size() || i < B.size();原创 2021-08-22 23:00:23 · 74 阅读 · 0 评论 -
AcWing 逆序对的数量 题解(归并排序求逆序对的模板)
#include<iostream>using namespace std;typedef long long ll;const int N = 1e5 + 10;int q[N], temp[N];int n;ll merge_sort(int q[], int l, int r){ if(l >= r) return 0; int mid = (l + r) >> 1; ll rv = merge_sort(q, l, mid) + merge原创 2021-08-22 20:48:47 · 73 阅读 · 0 评论 -
力扣 704 二分查找 题解 (二分)
力扣的格式有点搞不懂,暂时还是先不刷了,随手记一下代码吧二分模板题class Solution{ public: int search(vector<int>& nums, int target){ int mid, lef = 0, rig = nums.size() - 1; while(lef <= rig){ mid = lef + rig >> 1; if(nums[mid] == target) return mid;原创 2021-08-22 20:25:34 · 89 阅读 · 0 评论 -
洛谷 聪明的质检员 题解 (二分/前缀和的妙用)
纪念一下第一道绿题原题 建议用洛谷看题,牛客的公式不清楚解题思路:用二分确定w的值,二分的上限是最终的石块质量(遍历找到),下限是0。用fan[]结构体数组储存每次需要检测的范围,对于每一次二分的情况,先用前缀和数组a1[i]储存前i块满足要求的石头的价值(计算y值公式的第一个变量),用前缀和数组a2[i]储存前i块石头中满足要求的石头的数量(计算y值公式的第二个变量),遍历fan[]结构体数组,计算p的值,通过筛选将最小的|p - s|赋值给minn。如果s>p,说明标准值w太高了,需要降低标准原创 2021-08-22 17:56:16 · 169 阅读 · 0 评论 -
牛客 一元三次方程求解 (二分)
原题题不难,是个解决套路,详情见代码#include<iostream>#include<cstdio>using namespace std;double a, b, c, d;double def(double i){ double y = ((a * i + b) * i + c) * i + d; return y;}int main(){ cin.tie(0); cout.tie(0); ios::sync_with_stdio(fals原创 2021-08-22 15:50:30 · 86 阅读 · 0 评论 -
牛客 Best Cow Fences 题解 (二分/前缀和)
原题地址解题思路:①二分在本题中的运用是不断减小答案的范围,考虑到平均数是double类型,需要用实数的二分②需要找到一段长度不小于L的序列的平均数x,则需要这段序列的每个数减去x之后(b[]中介数组)相加(pre[]前缀和数组)等于0,如果前缀和数组左右相减(见③)的结果大于0,表明x还可以增大,如果小于0,表明x过大,应该减小③前缀和数组相减时,采用的策略是从最左端的长度为L的数组开始枚举序列的右端,每次枚举筛选这段序列最左端的前缀和值,记录枚举过的所有序列的的左端前缀和值的最小值,右端的前缀和原创 2021-08-22 14:59:37 · 122 阅读 · 0 评论