笔记
黑山咩
这个作者很懒,什么都没留下…
展开
-
暑假补题[7-1](交互题)
给出一个奇数长度的排列,两两进行位置互换,那最后必有一个元素未交换位置,每次询问可以得到一段区间内的所有数,在15次询问内找到这个数。思路:我们通过询问可以知道有多少数是原来这个区间的,因为一开始的数组必是1~n排列。那么这些数有两种可能,一是与这个区间的值进行了交换,两一种情况是未进行交换。若没进行交换的元素在这个区间,那么这个区间长度必为奇数,否则没有交换的区间一定在别的区间,对于这样的考虑,使用二分,可以满足在15次询问内得到答案。(交互题输出后加 “fflush(stdout) or cout.fl原创 2022-07-01 16:20:48 · 169 阅读 · 0 评论 -
暑假补题[6-30](AtCoder)
三个数字,每次选择两个-1,或者全部-1,问最少多少次操作全是0.没法全是0就输出-1.思路:排序以后看差值就好了。B:给你nn的矩阵,这个矩阵由1~nn组成且满足一个条件:每个格子的行都有一个比他小,每一列都有一个比他大。思路:总方案数-不合法方案不合法的方案中, 不合法的格子(即既是一行中的最小又是一列中的最大)只会有一个, 那么我们可以枚举这个格子上的元素是什么, 把比它小的放在同一列, 比它大的放在同一行, 然后把其他的元素填在剩余的 (nn - (2 * n - 1))个格子中就行原创 2022-06-30 20:58:07 · 218 阅读 · 0 评论 -
暑假补题[6-29](牛客)
牛客练习赛101:A.贪心,(n - 1) * (最大值-最小值)B.第一个位置可以是0,或者1,那么后面就可以随便放置,因为如果a1后面的数字和是偶数,a1=1,如果是奇数,a1=0.思路:贪心的考虑每一位是不是能为0,该位为0的条件是先设该位置为1,如果说ai&该位置为1时>ai+1&该位置为1时,那么该位置为0,把剩下的位数都这样去构造。如果说最后构造的数字不能满足条件,那么当前位置就为1.D:思路:分为两种情况:1.当图上有环时,那么环上连通就可以无限路径.2.当是一颗树原创 2022-06-29 11:34:40 · 105 阅读 · 0 评论 -
算法模板-2022
目录:树和图字符串和字典树记忆化搜索排序及逆序对离散化树链剖分素数筛法:同余定理单调栈数学期望LCA树和图Acwing285. 没有上司的舞会Ural 大学有 N 名职员,编号为 1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行原创 2022-05-12 13:29:03 · 623 阅读 · 0 评论 -
第三届算法设计与编程挑战赛(冬季赛)
先小记录一下自己的排名 ,只能说很可惜,差个20名就金奖啦。但是只能说自己还是有东西没学,D题应该是可以做出来的,但是最后也没做出来,最后罚坐了两个小时.B题:题目很简洁,存在一个上升序列b使得原序列a和序列b的绝对值差值不超过eps,这道题的话一眼就觉得是个二分的题目,为什么这么说呢,因为对于eps来说,我们设答案的eps为ans,那么可得每个大于ans的eps都是符合题目要求的,对于每个可以符合要求的答案,我们用二分取最小的那个.(拿例子举例,如果eps是1000,那么肯定是符合题意的,但是10原创 2022-03-30 13:39:19 · 295 阅读 · 0 评论 -
最小生成树(Kruskal)
#include<bits/stdc++.h>using namespace std;const int N = 600, M = 360000;int n, k, xi[N], yi[N], tot;int fa[N];int find_fa(int x){ if(x == fa[x])return x; return fa[x] = find_fa(fa[x]);} vector<int> res;struct p{ int x,...原创 2022-03-10 20:21:58 · 114 阅读 · 0 评论 -
AcWing1295.X的因子链
分析:先把X分解质因数,即x = p1^k1 * p2 ^k2 …pct^kct.那么前面能分解后面的即是p1, p1p2, p1^2 p2, p1^2 * p2^2,… ,p1^k1 * p2 ^k2 …pct^kct这样的规律下去,那么这一条链子的最大长度就是k1+k2+…+kct.那么我们就可以得到序列:a1,a2,a3…,at.那么这样的序列一共有多少个呢?我们可以做一个映射:a1,a2/a1,a3/a2,…,at/at-1那么该序列就是原序列的增量序列,即改序列有多少种排法那么序列就有多少种,.原创 2022-03-07 20:27:20 · 220 阅读 · 0 评论 -
Acwing提高课:最小生成树
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 500;int n;int dist[N], g[N][N];bool st[N];int prim(){ memset(dist, 0x3f, sizeof(dist)); dist[1] = 0; int res = 0; f.原创 2022-03-05 10:41:37 · 92 阅读 · 0 评论 -
Codeforces Round #491 (Div. 2)--Codeforces--problem/991/E
题目链接:https://codeforces.com/problemset/problem/991/E思路:多重集合的排列前置知识:比如说有1,2,3三个数字那么他们构成的排列为全排列:1 2 3,1 3 2,1,2 1 3,2 3 1,3 1 2,3 2 1.那么就是n!(n=3)321=6种.那么如果说是有重复的,比如说1 1 2 3,那么就是也就是4!/(2!*1!*1!*1!)种情况了.那么这道题里面把每个数字出现的次数存储起来,然后dfs一下.sum为全部数字(包括前导0的情况原创 2021-12-08 21:27:13 · 140 阅读 · 0 评论 -
数位DP(包含例题和模板)
如上题所示意:f®-f(l-1)就是答案.那么f(n)要怎么求呢?先把n分解为m进制的l位.那么对于第i位来说,就只有0或者1,因为题目里面没有系数.如181818=242^424+212^121.而没有282828=242^424+3∗223*2^23∗22.从最高位到最低位,那么对于第i位来说如果第i位>1那么第i位可以是0(组合数学,第i位下面的i-1位可以填k-last(已经填了的1的个数)个1,即C[i-1][k-last] (下标从1开始,若是从零开始就是C[i][k-last..原创 2021-11-23 13:44:37 · 581 阅读 · 0 评论 -
KMP算法必备工具之---可视化KMP算法(输入母串和子串可以看到变化,再也不用手动一个一个去试了)
每次算KMP的时候都要消耗一张纸来进行模拟,非常的不方便,于是打算用计算机做一个可视化的kmp算法出来,花费了几十分钟的努力终于搞出来了.可以说是呕心沥血了.代码如下://^_^#pragma warning(disable:4996)#include<stdio.h>#include<stdlib.h>#include<string.h> #include<stdio.h>#include<cstring>#define MAX原创 2021-11-20 17:07:59 · 1216 阅读 · 3 评论 -
ACwing第一章-动态规划dp之最长上升子序列模型
AC代码:#include<bits/stdc++.h>using namespace std;const int N = 150;int a[N],dp[N];int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ dp[i]=1; scanf("%d",&a..原创 2021-11-07 18:07:57 · 72 阅读 · 0 评论 -
心血来潮写一下组合数
组合数模板:#define ll long longconst ll mod = 555555555;ll c[5000][5000];void init(){ int i,j; c[0][0]=1; for(i=1;i<=4000;i++){ c[i][0]=1;c[i][i]=1; for(j=1;j<i;j++){ c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } }}设被行变换的数量为a,列变化的数量原创 2021-11-07 17:55:42 · 73 阅读 · 0 评论 -
ACwing第一章-动态规划dp之数字三角形模型
第一题:AC代码:(1)空间复杂度为O(n^2)的算法:#include<bits/stdc++.h>using namespace std;const int N = 150;int dp[N][N],a[N][N];int main(){ int T; scanf("%d",&T); while(T--){ memset(dp,0,sizeof(dp)); int r,c; scanf("%d%d",&r,&c); for(i原创 2021-10-25 18:27:01 · 110 阅读 · 0 评论 -
整数划分问题
dp优化:#include <iostream>using namespace std;const int N = 1010, MOD = 1e9 + 7;int dp[N];int main(){int n; cin >> n; dp[0] = 1; for(int i = 1; i <= n; i ++ ){ for(int j = i; j <= n; j ++ ){ dp[j]+=dp[j.原创 2021-10-03 16:39:56 · 64 阅读 · 0 评论 -
糖果传递与七夕祭
今天学了一个新的知识:ACwing122:糖果传递题解:如图,a1给an的糖果数目设为x1,a2给a1的糖果数目设为x2.已知最后每个人得到的糖果数目一样设为(avg).那么可以知道对于a1来说有方程->a1-x1+x2=avg.对于a2来说有方程->a2-x2+x3=avg…以此类推.我们可以把a1-x1+x2=avg转化成x1-x2=a1-avg.a2-x2+x3=avg转化为x2-x3=a2-zvg.…即x1-x2=a1-avg.x2-x3=a2-avg.…xn原创 2021-10-03 14:33:50 · 124 阅读 · 0 评论 -
2021-09-26动态规划
1.免费陷阱可以从后面一个时间开始往前推前面时间的状态:当前状态t-1获得的陷阱加上上个时间获得的陷阱.dp[t-1][x]+=max(dp[t][x],dp[t][x-1],dp[t][x+1]).AC代码:#include<iostream>#include<algorithm>#include<cstring>using namespace std;int dp[100011][15];int mmax(int a,int b,int c){原创 2021-09-27 11:34:54 · 94 阅读 · 0 评论 -
并查集例题及边带权和扩展域
A题:输入n个点(x,y).和两点至少距离d.然后分为两个操作:1.O p 修复p点。这时候遍历每个点如果两点距离小于d就放入一个集合.2.S l r查询l能不能到达r。AC代码:#include<iostream>#include<cmath>using namespace std;struct p{ int x,y;}a[2001];int fa[2001];int v[2001];int get(int x){ if(x==fa[x])retu原创 2021-09-20 20:12:50 · 67 阅读 · 0 评论 -
不含连续1的非负整数-力扣600
题意:给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。示例 1:输入: 5输出: 5解释:下面是带有相应二进制表示的非负整数<= 5:0 : 01 : 12 : 103 : 114 : 1005 : 101其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。说明: 1 <= n <= 10^9.思路:因为n的数据范围很大,暴力的话肯定是不行的.那么我们就使用01字典树来解决该问题.如下图:为什么要用原创 2021-09-11 15:33:45 · 205 阅读 · 0 评论 -
KMP算法,字符串哈希,最长公共子序列LCS,最长回文子序列LPS,AC自动机详细及模板
KMP算法能在线性时间内判定字符串A【1~N】是否为字符串V【1 ~M】的子串,并求出A在B中各次出现的位置.·原创 2021-09-04 22:30:45 · 333 阅读 · 0 评论 -
数论:唯一分解定理丶调和级数
H - Pairs Forming LCM今天又偷学了一手唯一分解定理的小知识:n=p1_11e1 *p2_22e2 *p3_33e3 *…*pk_kkk.设a,b为n的两个因子,则:a=p1_11a1 *p2_22a2 *p3_33a3 *…*pk_kkk.b=p1_11b1 *p2_22b2 *p3_33b3 *…*pk_kkk.推论:gcd(a,b)=p1_11min(a1,b1) *p2_22min(a2,b2) *p3_33min(a3,b3) *…*p原创 2021-08-31 17:35:30 · 138 阅读 · 0 评论 -
逆元的两种求法
逆元逆元是什么网上有很多资料就不多阐述了.!主要用于把除法变成乘法!结论:a/b%mod=a*(b的逆元)%mod.比如说一个组合数若是除数或者被除数太大精度就会出问题.这时候就需要通过逆元把除法转换为乘法费马小定理及欧拉定理费马小定理: 当mod为素数时a^(mod-1)%mod=1.左右两边除a变成a^(mod-2)%mod = a^-1.所以a的逆元就是a^(mod-2).const int mod=10007;ll fastpow(ll a,ll b){ if(a==1)re原创 2021-08-29 22:01:35 · 458 阅读 · 0 评论 -
七夕没女朋友呜呜呜T_T (2021牛客七夕节场)
8.19一点凌晨睡不着 就想着来做点事 思来想去不如来写题算了 杭电多校和牛客竞赛的题还没补 来一边写一边补七夕场的题A题是一个二次元喂狗粮的问题就不写了┭┮﹏┭┮C题是一个开玩笑的题hhE是一个推理的也不写了0.0D-亲密数:这道题有个收获的地方就是求因子和:LL find(LL x){ int sum = 1, t = sqrt(x); for (int i = 2; i <= t; ++i) if (x % i == 0)原创 2021-08-19 03:33:18 · 131 阅读 · 2 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(8)Counting Stars
链接:题目题目大意:给出n个整数.有三种操作:1.询问[l r]的总和2.[l r]里面所有数减去x&(-x)也就是去掉最低位3.[l r]里面所有数加上2^k( 2^k<=x<= 2^k+1),也就是说加上一个二进制的最高位,比如1010+1000=10010,观察不免发现是最高位左移一位.思路:操作2就是去掉最低位,操作3就是最高位左移,那么我们就可以将一个数字拆成两部分 一部分是a1也就是最高位代表的数字,一部分是a2也就是剩下位代表的数字 (如:10110,那么a1原创 2021-08-13 20:13:09 · 138 阅读 · 0 评论 -
补题日记(持续更新)
第一天:牛客多校第五场D Double Strings链接:大佬的博客给定两个字符串A,B求长度相同的AB子串,使得子串的前面部分相等,且第一个不相等的位置B>A。求这样的子串个数。思路:f[i][j]表示A的前i个字符与B的前j个字符能组成多少相等的子串。自我理解:比如说abcd,abdc,那样遍历到b的时候由于前面a是一样的,那当前的字串数量f[i][j]就会加上前面的字串数量+f[i-1][j-1],(也就是加上a时的数量),其他情况下就是加上大一点的那个,f[i][j]=((f[i原创 2021-08-12 03:49:33 · 269 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(6)Median
杭电7029 MedianAC代码:#include<bits/stdc++.h>const int N= 1e5+10;using namespace std;#define ll long longll a[N],b[N];int main(){ int T; cin>>T; while(T--){ ll num=0,n,m; cin>>n>>m; memset(a,0,s原创 2021-08-07 18:14:17 · 91 阅读 · 0 评论 -
King of Range
题意:输入一个长度为n的数组,有m次询问,每次询问输入一个整数k,求有多少个区间的最大值和最小值的差大于k思路:st表求最大最小值,但是查询时要用到双指针(就是没用这个所以没过).ST表ST表的功能很简单它是解决RMQ问题(区间最值问题)的一种强有力的工具它可以做到O(nlogn)预处理,O(1)是查询最值像线段树是O(logn)的查询AC代码:#include<algorithm>#include<iostream>#include<cs原创 2021-08-01 11:33:40 · 68 阅读 · 0 评论 -
2021牛客暑期多校训练营1
A题:枚举每个sum,i代表n,j代表m,即求出sg函数注意:要用bitset不能用bool不然会超时#include<iostream>#include<string>#include <bits/stdc++.h>using namespace std;const int N = 5005;bitset<N> F[N];void pre(){ for(int sum=0;sum<=10000;sum++){ for(i原创 2021-07-21 20:33:27 · 73 阅读 · 1 评论 -
BNUZ [kuangbin带你飞] 最小生成树
There are N small balls with same weight in horizontal smooth plane. And the volume of these balls can be negligible. All the balls are on the same straight line. There are three possibilities for their initial speed $$$v_0$$$ which is -1 m/s, 0 m/s and 1原创 2021-07-12 15:22:06 · 83 阅读 · 0 评论 -
Codeforces Round #729 (Div. 2)
A题:大意就是说给你一个数字n,输入2*n个数,这些数里面能不能全部两两相加结果为奇数,这样就分为三种情况:1.奇+奇=偶,2.奇+偶=奇,3.偶+偶=偶.那样就必须全部都是1奇配1偶才行)所以统计奇的数量和偶的数量是不是相同就行了AC代码;#include<iostream>using namespace std;int main(){ int t; cin>>t; while(t--){ int n,f1=0,f2=0; cin>>n;原创 2021-07-04 11:46:06 · 115 阅读 · 0 评论 -
矩阵快速幂例题
例题一:A. Tetrahedrontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard output题解:容易看出这是一个指定路径数求方案数的题目,可以用矩阵快速幂来求解。矩阵快速幂解法:#include<iostream>#include<cstring>#define ll long longusing name原创 2021-05-16 21:49:39 · 289 阅读 · 0 评论 -
2021 BNUZ IT节 程序设计竞赛网络赛
题解特拉福珠宝俱乐部大奉卖笔人我的徒弟都是实习生快穿之我只想测身高游戏败家子北宋大烟篓超神排位赛我有一座研究院特拉福珠宝俱乐部解法一:暴力dfs,每个源点都去dfs一边,非常的暴力hhh:复杂度O(n^2)#include<iostream>#include<queue>#include<cstring>#define ll long longusing namespace std;int n, tot;int ver[100010], edge[1原创 2021-05-10 19:37:44 · 206 阅读 · 0 评论 -
并查集
链接转载 2021-04-29 12:55:28 · 67 阅读 · 0 评论 -
约数
约数算数基本定理的推论求N的正约数集合试除法求1~N每个数的正约数集合倍数法例题最大公约数欧几里得算法互质与欧拉函数互质的定义:欧拉函数积性函数算数基本定理的推论N的正约数集合:{p1b1p_1^{b1}p1b1p2b2p_2^{b2}p2b2…pmbmp_m^{bm}pmbm},其中0<=bi<=ciN的正约术个数为:(c1+1)∗(c2+1)∗...∗(cm+1)=∏i=1m(ci+1)(c_1+1)*(c_2+1)*...*(c_m+1) = \prod_{i=1}^{m}原创 2021-04-22 14:45:09 · 121 阅读 · 0 评论 -
ACM知识清单模版笔记
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参原创 2021-04-22 00:19:02 · 146 阅读 · 0 评论 -
质数
质数判定1.试除法bool is_prime(int n) { if (n < 2) return false; for (int i = 2; i <= sqrt(n); i++) if (n % i == 0)return false; return true;}质数的筛选Eratosthenes筛法求出1~n的所有质数void primes(int n) { memset(v, 0, sizeof(v));//合数标记 for (int i = 2; i &l原创 2021-04-22 00:14:55 · 97 阅读 · 0 评论 -
二分
二分整数集合上的二分1.答案出于闭区间[l,r]以内,循环以l=r结束:2.答案出于闭区间[l,r]以外,循环以l=r+1结束实数域上的二分二分转答案实例例子1:例子2:Best Cow Fences(AcWing102)其他题:整数集合上的二分本文章的二分写法保证最终答案出于闭区间[l,r]以内,循环以l=r结束,每次二分的中间值mid会归属左半段与右半段二者之一在单调递增序列a中查找>=x的数中最小的一个(即x或x的后继):1.答案出于闭区间[l,r]以内,循环以l=r结束:写法1:i原创 2021-04-21 23:17:33 · 126 阅读 · 0 评论 -
前缀和与差分
前缀和数组:S[i] = ∑j=1iA[j]\displaystyle\sum_{j=1}^{i} A[j]j=1∑iA[j]sum(l.r)=∑i=lrA[i]\displaystyle\sum_{i=l}^{r} A[i]i=l∑rA[i]=S[r]-s[l-1]例题:地图上有 N 个目标,用整数 Xi,Yi 表示目标在地图上的位置,每个目标都有一个价值 Wi。注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁一个包含 R×R 个位置的正方形内的所有目标。激光炸弹的投放是原创 2021-04-20 15:55:28 · 85 阅读 · 0 评论 -
递推与递归
斐波那契额数列:递推:#include<iostream>using namespace std;int main() { int a[100]; a[1] = 0, a[2] = 1; for (int i = 3; i <= 10; i++) { a[i] = a[i - 1] + a[i - 2]; }}递归:#include<iostream>using namespace std;int func(int n) { if (n ==原创 2021-04-20 15:21:11 · 74 阅读 · 0 评论 -
位运算
文章目录位运算及其运用和实例一、位运算符号二、实例1.快速幂:2.A*B%MOD3.二进制状态压缩位运算及其运用和实例一、位运算符号位运算分为4种:与或&|非异或~^#include<iostream>using namespace std;int main() { int a = 1; a ^= 1; cout << a << endl;//0,不同为1,相同为0(1^1=0) .原创 2021-04-20 15:02:30 · 117 阅读 · 0 评论