
数论差分前缀和杂
.
小菜0-o
卷心菜,又卷又菜
展开
-
【无标题】
#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<stack>#define x first#define y secondusing namespace std;const int N = 1;typedef long long ll;//线性筛素数//求最小质因数bo原创 2022-04-08 21:31:56 · 193 阅读 · 0 评论 -
1295. X的因子链
1295. X的因子链题解//算数基本定理//线性筛素数//求所有质因子#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N = (1<<20) + 10;int primes[N],cnt; //筛素数需要 bool st[N]; //筛素数需要原创 2022-04-03 10:57:52 · 302 阅读 · 0 评论 -
L2-039 清点代码库 (25 分)
L2-039 清点代码库 (25 分)map:从vector 到 int 的映射Set : vector 作为集合元素。map<vector<int>,int> Hash_Table; //存放该vector的个数set<vector<int>> Set; //集合 互异性#include<iostream>#include<algorithm>#include<cstring>#include<v原创 2022-03-21 21:56:19 · 469 阅读 · 0 评论 -
L2-037 包装机 (25 分)
L2-037 包装机 (25 分)之前一直没AC只得了20分后来发现是自己的问题,感谢大佬的题解,当传送带上为空,此时虽然栈满,但是也不会弹出东西。就是,先后的问题写错了。但是,自己当时就是发现不了,哎。一方面是太着急,一方面是能力不够。读题的时候,一定要小心,全面。另外自己也没想到,传送带符合先进先出,后进后出的特点,可以用队列。#include<iostream>#include<cstring>#include<algorithm>#inclu原创 2022-03-21 19:20:57 · 538 阅读 · 0 评论 -
1246. 等差数列
1246. 等差数列a[i] = a[1] + (i - 1) * d所以和a[1] 与 d有关系。最大公差就是 所有a[i] - a[1] 的最大公约数d = gcd(d, a[i] - a[1])#include<bits/stdc++.h>using namespace std;const int N = 1e5+ 10;int a[N];int n;int gcd(int a,int b){ while(b) { int c = a; a = b;原创 2022-03-20 18:17:25 · 274 阅读 · 0 评论 -
日期类的题目还可以这样做
#include<iostream>#include<cstring>#include<algorithm>#include<stack>#include<cmath>using namespace std;int M[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};bool check(int year){ if(year % 400 ||( year % 100!=0 &am.原创 2022-03-10 15:45:02 · 102 阅读 · 0 评论 -
1239. 乘积最大双指针——感觉好难
1239. 乘积最大 双指针选法:k为奇数:如果全负,则从最右边选k个数如果至少一个为正:则选择最大的正数,则转化为k为偶数情况,故一定为正综上k为奇数一定选择最右边的数,然后k-1,k变成偶数,然后按k为偶数情况做。k为偶数:左边右边一次各取两个数,判断哪个大取哪个。但是这样是有个小问题的: 如果k为偶数是从k为奇数转移而来的且所有数全为负数,一次取两个 左边会大于右边 也就是取左边,但实际上全为负数时应该从最右边取。所以这时需要判断是否存在至少一个正数,如果存在,那应该按大的来取原创 2022-02-20 16:04:01 · 468 阅读 · 0 评论 -
试题 历届真题 循环节显示问题【第二届】【决赛】【本科组】
试题 历届真题 循环节显示问题【第二届】【决赛】【本科组】题解问题描述 1/7 = 0.142857142… 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。本题目要求即是:给出一个数字的循环小数表示法。输入输出用例 例如:输入格式 1,5 则输出: 0.2输入格式 1,7 则输出: 0.[142857]输入格式 7,6 则输出: 1.1[6]数据规模和约定 用户输入的格式是: 整数,整数每个整数范围均为:1~1000原创 2022-02-16 15:01:56 · 127 阅读 · 0 评论 -
1238. 日志统计双指针算法
1238. 日志统计双指针算法题解#include<iostream>#include<cstring>#include<algorithm>#define x first#define y secondusing namespace std;const int N = 1e5+10;int n,d,k; //数据数 时间 不小于的赞的个数typedef pair<int,int> PII; PII logs[N]; //用来记录读原创 2022-02-16 09:34:19 · 135 阅读 · 0 评论 -
关于高精度的思考
目前见过的有两种情况:1. 两个高精度数组相乘这种情况就是res[i+j-1] += a[i] * b[j], 然后再进位处理 for(int i=1;i<=al;i++) for(int j=1;j<=bl;j++) { res[i+j-1] += a[i] * b[j]; } for(int i=1;i<=al+bl;i++) if(res[i] >= 10原创 2022-02-14 18:28:01 · 171 阅读 · 0 评论 -
高精度乘法
P1303 A*B Problem第一个数的第i位与第二个数的第j位乘起来是放在结果的第i+j-1位 别忘了把两个数字倒过来这里的第几位都是从1开始!速记方法:都看第一位的话,是1+1 = 2.但是开始应该是第一位,所以应该减去一res[i+j-1] += a[i] * b[j]#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N =原创 2022-02-14 17:16:01 · 160 阅读 · 0 评论 -
差分和前缀和
差分和前缀和差分和前缀和是互为逆操作 的假设原数组是a[] 差分数组是b[] 前缀和数组是s[]s 是a的前缀和,a是b的前缀和。所以前缀和和原数组的关系 相当于 原数组和差分数组的关系s[i] = a[1] + a[2] + a[3] + a[4] + ... + a[i];a[i] = b[1] + b[2] + b[3] + b[4] + ... + b[i];一维s[i] = a[1] + … + a[i]a[i] = b[1] + … + b[i]二维前缀和和原数组的关系原创 2022-02-10 16:40:37 · 528 阅读 · 0 评论 -
1270. 数列区间最大值
1270. 数列区间最大值回顾一下RMQ算法求区间最值f[i][j]表示从第i个数开始 连续2j个数的最大值或最小值。所以f[i][j]表示的数的范围是i ~ i + 2j - 1 (因为从a ~ b有b-a+1个数)通过2j-1把区间分成两份:i~ i + 2j-1 - 1 和 i + 2j-1 ~ i + 2j - 1。求最大值最小值即可。#include<iostream>#include<cstring>#include<algorithm>原创 2022-02-10 15:47:06 · 411 阅读 · 0 评论 -
1232. 三体攻击
1232. 三体攻击怎么做啊这种题做一遍根本不会。题解#include <iostream>#include <cstring>using namespace std;typedef long long LL;const int N = 2000010;int A, B, C, m;LL s[N]; // 原数组LL b[N], bp[N]; // 差分数组int d[8][4] = { // 差分数组和原数组 相互转换 使用到的偏移量和系数原创 2022-02-10 14:49:56 · 146 阅读 · 0 评论 -
3419. 双向排序
3419. 双向排序题解说是不应该出现在B组里。我卒了#include<iostream>#include<cstring>#include<algorithm>#define x first#define y secondusing namespace std;typedef pair<int,int> PII;const int N = 1e5+10;PII stk[N];int ans[N];int n,m;int main原创 2022-01-27 15:15:41 · 647 阅读 · 0 评论 -
Acwing3418. 杨辉三角形
3418. 杨辉三角形题解#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;int n;ll C(int a,int b){ printf("计算C %d %d\n",a,b); ll res = 1; for(int i=a,j=1;j<=b;i--,j++) {原创 2022-01-27 08:59:35 · 651 阅读 · 0 评论 -
线段树..
线段树 放掉!struct node{ int L,R; //左右边界 int sum; //区间和 }求区间和的线段树对半开,M = L + R / 2下取整单点修改:递归+回溯修改先递归找到5,再往上翻区间查询:递归查询,如果当前区间在要查询区间内部,则直接返回当前区间和。如果当前区间和要查询区间有交集,则递归查找有交集的那一部分。蓝桥杯里的线段树里大概率是没有懒标记的!!!吼吼吼没有懒标记的难度为4,有懒标记的难度至少为7重要函数pushup:用子节点信息更新原创 2022-01-24 17:33:09 · 121 阅读 · 0 评论 -
1241. 外卖店优先级
1241. 外卖店优先级特别思考一下,他是怎么处理同一时间相同的店铺的订单的。j是往后枚举找,跳出while循环时一定不是相同的订单了,故订单是从 i ~ j-1之间有 j - 1 - i + 1 = j-i个订单。一开始 j = i,所以到了最后也会 j ++ .然后不符合 j<=m 了跳出循环 i =j,也跳出循环。 while(j<=m && order[i]==order[j]) j++; //第j的订单是不相同的,但是第i个订单没有算上,相当于补到第j个订原创 2022-01-21 17:27:59 · 436 阅读 · 0 评论 -
1231. 航班时间_回顾
1231. 航班时间将所有时间转化成秒,在把秒转化为小时,分钟,秒。去的时间 = 飞行时间 - 时差。回来的时间 =飞行时间 时间 + 时差。去加上回来就减掉,去的时候减去时差回来就加上。所以实际飞行时间= (去的时间 + 回来的时间) / 23678s是多少小时,多少分钟,多少秒小时:3678 % 3600分钟:3678 % 3600 / 60秒: 3678 % 60后面即使没有东西也可以用scanf读,设置一个初值即可。#include<iostream>#in原创 2022-01-21 15:50:41 · 407 阅读 · 0 评论 -
1229. 日期问题
1229. 日期问题从19600101~20591231枚举每个数判断是否合法判断是否能表示为给定的日期。#include<iostream>#include<cstring>#include<algorithm>using namespace std;int a,b,c;int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};bool check(int date) //判断日期是否合法原创 2022-01-20 18:34:11 · 182 阅读 · 0 评论 -
466. 回文日期
466. 回文日期换一种思路,枚举所有的合法日期要比判断日期是否合法难很多。所以直接枚举回文数,在进行下面的操作先枚举回文数,将4位数转化为8位回文数判断是否在范围内 : min_date <= date <= max_date判断日期是否合法 :月份在1~12 , day>=1且小于等于当月天数这样的时间复杂度是只需要枚举1000~9999,106,一百万的复杂度。1 . 如何将4位回文数转化为8位数字12344321可以看出是从后往前拼接,所以每次每次date =原创 2022-01-19 18:08:51 · 316 阅读 · 0 评论 -
1236. 递增三元组(_二分_前缀和)
1236. 递增三元组最暴力的方法就是三重枚举,for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(a[i]<b[j]<c[k]) res++;这样肯定会超时。就考虑少一层或几层循环由于数据范围是100000,所以算法肯定是一个nlogn的算法。所以,这就说明只允许我们枚举一个数组。枚举a[]和枚举c[]是一样的,都是边上的一个数组。正确做法是枚举b[]自己原创 2022-01-18 18:57:55 · 891 阅读 · 0 评论 -
1247. 后缀表达式
1247. 后缀表达式#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int N = 100000 + 10;int a[N*2]; //正数和负数都可能是100000个int n,m;int main(){ cin>>n>>m; for(int i=1;i<=n+m+1;i++)原创 2022-01-16 15:56:52 · 69 阅读 · 0 评论 -
题目 1492: 蓝桥杯算法提高VIP-产生数_
题目 1492: 蓝桥杯算法提高VIP-产生数Floyd算法:如果1->2 2->3则1->3。很像三重循环求任意两点之间的最短路。大数的乘法。从右往左,数的位数从0开始,第一个数的i位数 * 第二个数的第 j 位要放在结果的 i + j 位上。进位最后处理。这个题是大数的乘法,又不太一样。a[i]表示i可以变换a[i] 次。所有的从0~9的每个数可以变换的次数乘起来即是最后的答案。所以i->i变成本身也要算1次变换,否则会导致*0。结果数组的第一个数也要初始化位1避免 *原创 2022-01-15 11:11:12 · 238 阅读 · 0 评论 -
题目 1478: 蓝桥杯算法提高VIP-3000米排名预测
题目 1478: 蓝桥杯算法提高VIP-3000米排名预测好难。需要的知识点全排列的库函数next_permutation(a,a+n)检查一个串有无在另一个串中出现过。不是KMP那样的字串,可以是不连续的字串。东西倒是不多,就是很难写。2022 1 14 16:55写了两个小时最起码不过好歹顺利写出来了AC那一刻,感觉多巴胺飙升//正确的序列要全部出现过,错误的序列一个也不能出现#include<iostream>#include<cstring>#in原创 2022-01-14 16:55:39 · 3456 阅读 · 0 评论 -
题目 1445: 蓝桥杯历届试题-最大子阵__算法思维
题目 1445: 蓝桥杯历届试题-最大子阵一开始以为可以用二维前缀和做,做完TLE了。空间换时间常规做法是四重循环,两重枚举矩阵的左上角或者右上角,两重枚举矩阵的长和宽。时间复杂度分析: 500500500*500 = 62,500,000,000会超时。所以分析怎么少一重循环。a[i][j]表示第j列从第1行到第i行的数的和。再来一个sum 存储前面几列的所有的和。这样就可以表示任意一个矩阵。假设当前在第一列,第一列到第i行的数是正的,那后面看第二列的时候就需要加上第一列的这些正的,用原创 2022-01-13 19:25:49 · 283 阅读 · 0 评论 -
AcWing 1205. 买不到的数目
AcWing 1205. 买不到的数目我的打卡这个题非常经典,在小学数奥,NOIP里y总都见过。当成定理记住。有q 和 p两个数res = a*q + b*p,求res最大的不能凑出来的数是多少。a b可取任意值这个题目是不一定有解的。当p q的最大公约数d大于1时,所有不是d的倍数的数都不能凑出来。62不是2的倍数的就都凑不出来了。其实这些都不用考虑。因为题目一定有解。如果p q 互质,则一定有点裴蜀定理如果p q的最大公约数是d,(p,q) = d,则一定存在两个整数满足原创 2022-01-13 16:54:24 · 140 阅读 · 0 评论 -
1230. K倍区间★★★★
1230. K倍区间写在前面: y总说蓝桥杯的题代码都不是很长,但是思路比较难想.需要花大量的时间放在思路上.一开始很难想出最优的解决方案,但是不要放弃.难点: 如何优化掉第二重循环for(int r=1;r<=n;r++) for(int l=1;l<=r;l++) { if(sum[r] - sum[l-1] % k ==0) res ++; }第二重循环的目的是找1~r中有多少个l 满足sum[r] - sum[l原创 2021-12-30 11:32:06 · 3923 阅读 · 0 评论 -
二维前缀和
99. 激光炸弹炸弹只能炸R*R的正方形内的所有目标,处于正方形四条边上的炸不到。题目给的R的范围很大,但是实际上大一点和大很多效果都是一样的,都是一下子全炸完。又由(1)所以r最大取5001即可枚举边长为R的所有正方形,取最大的。假设从右下角开始枚举。这里的正方形的右下角不能恰好是这个点,如果这样的话只能枚举(R-1)(R-1)个。所以将右下角分别向下向右移动0.5个格,这样就可以枚举RR了这样只能找到22 = 4个这样找到33个其实只是思路的变化,代码并没有改变还是等效的。。#原创 2021-12-29 20:29:56 · 435 阅读 · 0 评论 -
Acwing4195. 线段覆盖(差分)
Acwing4195. 线段覆盖输出是让输出被1~n个线段所覆盖的点的个数noteworthly1.这个题需要离散化,直接用map就能做。需要遍历map中的每个元素,需要用到map的迭代器map<key,value>::iterator itermap的迭代器遍历不只遍历所有的元素,最后还会遍历一个key==0表示遍历结束。即使给key=0赋值最后还是会遍历key == 0作为结束2.解题的思路是差分差分需要用到差分数组,一般用b【】数组还需要用到前缀和。就不需要用前缀和数组,原创 2021-12-12 10:56:18 · 667 阅读 · 1 评论 -
Acwing1482. 进制
很强的一个题1.将一个数a的radix进制表达式转化为10进制时,最大可表示成3610=3.65*1015,即未知表达式的最大进制可以是一个数=3 * 1015。同时,已知的表达式的最大值是约束死了的,就是3 *1015,所以如果在计算未知的res时超过了最大值,那肯定就是无解了,算都不用算了。2.要求输出的进制不限于36,最大到3 *1015.所以,用到的思路是二分radix。是有序的,所以二分找。如果是l<=r,就不用r+1,否则是l<r,r取不到。所以r=res+13.二分还得..原创 2021-11-14 20:46:35 · 758 阅读 · 0 评论 -
P2613 【模板】有理数取余
看这个数据范围,就是天王老子来了他也存不下啊。所以在读入的时候就要对之取余。介绍一下快速读入:int的快速读入全文背诵。inline int getint(){ int res=0,ch=getchar(); //ch用来过滤其他字符 while(!isdigit(ch)&&ch!=EOF) ch=getchar(); while(isdigit(ch)) { res=(res<<3)+(res&l...原创 2021-11-14 19:54:12 · 233 阅读 · 0 评论 -
P1082 [NOIP2012 提高组] 同余方程 题解
1.欧几里得:求gcd:int gcd(int a,int b){ if(b==0) return a; gca(b,a%b);}2.拓展欧几里得ax % by ==gcd(a,b)。int x,y;int exgcd(int a,int b){ if(b==0) { x=1;y=0;return a;//a是最大公约数 } int ans=exgcd(b,a%b); int temp=y; y=x-(a/b)*y; x=temp; return ans;//返..原创 2021-11-14 19:24:59 · 532 阅读 · 0 评论 -
2068. 整数拼接ACwing多看
解析传送门说一个:a[j]*10i=-a[i]%k=(k-a[i])%k前面预处理完,后面找为什么找长度是len(a[i]),即a[i]*10i呢?你仔细看上面的式子,等号前面是乘10i,后面也是a[i],所以就是找乘10i的还得多看判重应该是判a[i]*10i % m ==(m-a[i])%m#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>u..原创 2021-11-14 17:14:04 · 568 阅读 · 0 评论 -
P1226 【模板】快速幂||取余运算
3^5 = 3^4 + 3^1#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long int ll;ll a,b,p;ll calculate(int a,int b){ ll res=1; while(b>0) { if(b&1) res=(res%p*a%p)%p; ..原创 2021-11-14 16:28:25 · 362 阅读 · 0 评论 -
P3383 【模板】线性筛素数
线性筛素数,其线性体现在每个合数只被其最小质因数筛掉。12=34=62,12应该是被2筛掉,所以是到6的时候,res[1]=2,就把12筛掉了。外层循环是每个数i,内层循环是筛掉i*最小质因数=未来某个很大的数。#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 1e8+10;int res[N],su[N];int main..原创 2021-11-14 16:15:54 · 583 阅读 · 0 评论