- 博客(33)
- 收藏
- 关注
原创 博弈论
文章目录1.组合游戏1.1.基本概念1.2.Nim游戏与Nim和1.2.1.Nim游戏1.2.2.Nim和1.2.3.Bouton's定理1.2.4.Nim游戏变种1.组合游戏1.1.基本概念组合游戏特点:组合游戏中常见定义:1.2.Nim游戏与Nim和1.2.1.Nim游戏1.2.2.Nim和1.2.3.Bouton’s定理1.2.4.Nim游戏变种...
2020-07-31 14:41:19 200 1
原创 技巧和思想
文章目录1.打表法1.打表法打表法就是将题目中需要的答案集合提前算出来,存到代码里,根据题目所需取答案,这种方法通常只需要将程序挂着,在表打完后进行加工,最终取答案程序时间复杂度为O(1),空间复杂度为O(n)(n为答案规模); ——沃兹·基朔德例题:洛谷P1217此题的数据范围是一亿,找出其中的回文质数,很容易就TLE,于是采用了打表的方法,现把满足条件的数算出来,然后提交的程序就非常简单。打表代码:#include<stdio.h>#include<iostream&
2020-07-25 20:05:30 489
原创 数学相关
素数筛在找质数的时候多数情况下都要用到素数筛,接下来简单介绍3种1.二层循环判断法本方法算不上是筛,因为本方法是判断所给数是否为素数。本方法运用比较灵活,如打表等。代码:bool judgesushu(int x){ if(x>2 && x%2==0) return 0; for(int i=3;i<=sqrt(x);i+=2) { if(x%i==0) return 0; }
2020-07-20 15:51:21 247 2
转载 ACM知识图
ACM知识图转载于https://blog.csdn.net/zsjzliziyang/article/details/81945198
2020-07-20 10:43:53 368 1
原创 板子合集
板子合集gcd(最大公因数)int gcd(int a,int b){ return b?gcd(b,a%b):a;}ksm(快速幂)int ksm(int a,int b,int p){ int ret=1; while(b){ if(b&1) ret=ret*a%p; a=a*a%p; b>>=1; } return ret%p;}
2020-07-18 16:25:44 302
原创 数据结构
B站ACM专题讲解:简单数据结构up主:想飞的小菜鸡视频链接介绍的数据结构有:链表、队列、栈、字符串、树、二叉树、图、并查集。链表 STL链表用法 经典例题:队列安排 本题提示:erase可以删除迭代器指向的元素,remove可以删除某个特定值的元素,erase效率比remove更高(见前几次TLE)队列 STL队列用法 经典例题:机器翻译栈 STL栈...
2020-07-18 13:46:42 198
原创 字符串
B站ACM专题讲解:字符串B站up主:想飞的小菜鸡视频链接本次内容包括KMP算法、AC自动机、后缀数组、最小表示法KMP算法 不同地方KMP算法的定义都不相同,先上这里定义的初始化 next数组算法:void Next(char P[],int next[]){ int i,j;//j:模板字符串下标;i:最大前后缀长度 int m=strlen(P);//模板字符串长度 next[0]=0//模板字符串的第一个字符的最大前后缀长度为0 for(j=1,i=0 ; j<m
2020-07-17 15:22:35 193
原创 LeetCode自定义sort和优先队列的排序方式
sort如果自己写cmp在LeetCode里要将其定义为static如果要写优先队列则需要: class Solution { public: struct Cmp { bool operator()(ListNode* a, ListNode* b) { return a->val > b->val; } }; ListNode* mergeKLists(vect
2021-12-15 11:36:24 4301
原创 滑动窗口写法
滑动窗口类似单调队列,但是一般的滑动窗口写法更加简单,大致思路为设置边界为右边界为数组边界,每次向右移一个,若不满足要求一直移动左边界直到满足条件个人写法:int lengthOfLongestSubstring(string s) { int n=s.size(); map<char,int> m; for(int i=0;i<n;++i) m[s[i]]=0; int ans=0; for(int i = 0, j = 0; j < n; j+
2021-12-15 11:34:17 722
原创 LeetCode 最长回文子串 暴力+马拉车
题目地址方法一:枚举每个回文串中点,复杂度为O(n2)O(n^2)O(n2)代码:pair<int,int> f(string s,int left,int right){ //学一下pair用法和返回 while(left>=0 && right<s.size() && s[left]==s[right]) left--,right++; return {left+1,right-1};}string lo
2021-12-12 13:03:42 3791
原创 LeetCode terminate called after throwing an instance of ‘std::out_of_range‘ 报错处理
应该是substr方法出现越界情况
2021-12-12 12:14:30 1269
原创 2021-07-27
HDU多校 Rise in Price链接题目链接题意两个100*100的矩阵,每次可以向下或者向右移动一格。每次移动可以在A矩阵的对应位置取得对应数量的宝石,同时宝石的价值会增长B矩阵对应的数值。问最后总的最大价值。题解用vector<pair<int,int>> f[N][N];存每一点的信息,其中pair的两个元素分别存已获得宝石的数量和宝石的价值,vector存在i,j这一位置有多少可能的情况,最后在终点遍历每一种情况求最值即可。需要注意的是纯搜索复杂度过高,会
2021-07-27 20:43:19 101
原创 Squared Error 数学
Squared Error 数学链接题解以a,b,c为例(b-a)(b-a)+(c-a)(c-a)+(c-b)(c-b)=a✖a+b✖b+c✖c -(a+b+c)✖(a+b+c)代码#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>#include<cmath>#include<algorithm>#include<s
2021-03-09 15:58:56 767
原创 Early Ordered 思维题
Early Ordered 思维题链接题意有n个数,从中不改变顺序找出从1到m的每一个数并保证字典序最小题解构造一个数组存储临时答案,从前向后遍历每一个数,如果不在临时答案数组里,则加入数组,加入前将他前面的比他小的、之后还会出现的数全部删掉保证字典序最小代码#include<bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long long#define ld long
2021-03-07 23:26:28 94
原创 Flatten-分解因数
Flatten-分解因数链接题解看似直接求lcm,但会超时。选择分解因数,通过个因数出现的次数求出最大公倍数。代码#include<bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long long#define ld long doubleinline int read(){ char ch = getchar();int x = 0, f = 1; w
2021-03-03 15:51:17 141 1
原创 拯救行动-bfs
拯救行动-bfs链接题意bfs搜图,不同是要处理可以干掉的守卫题解守卫不可以通过更改地图实现消灭,因为这样会影响下一次搜索的查找。所使用的方法是建立步数优先的优先队列来取代普通bfs的队列,每次弹出步数最小的元素进行bfs。代码#include<bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long long#define ld long doubleinline i
2021-03-03 14:45:46 272 1
原创 Train-Dijkstra优先队列优化
Train-Dijkstra优先队列优化链接链接题解求指定两点最短路。可以看作Dijkstra板子题目,只是更新的时候考虑列车发车时间做上取整。代码#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>#include<cmath>#include<algorithm>#include<string>#includ
2021-02-21 14:13:07 133
原创 归并排序思维题
归并排序思维题链接题目链接题意给定两个序列,每次操作可以交换同一序列相邻的数字,问最少经过多少次操作可以可以使两个序列相同位相加的平方的和最大题解要使和最大,一定是两个序列最大的和最大的搭配,第二的和第二的搭配等。重要的是求要换次数。要点:交换次数就是求逆序对,可以使用归并排序可以看作一个序列不动,另一个序列排序后和不动序列顺序一样即可。核心代码:for(ll i=1;i<=n;++i) x[a[i].id]=b[i].id;sort之后,a和b的数组顺序是按照val从
2021-02-20 14:03:15 115
原创 线性筛应用
线性筛的应用题目链接题目链接题意给定区间,求区间中有多少可以表示为两个质数相乘的数,其中1可以看作质数。题解数据范围为1e7,用ans数组存储1e7个数每一个是否为题目要求的好数,这里用到了线性筛的prime数组存储的是质数的性质,之后优化为前缀数组。代码#include<bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long longinline int read(
2021-02-20 13:52:50 123
原创 归并排序
归并排序板子:#include<iostream>#include<queue>#include<algorithm>#include<cmath>#include<string>#include<set>#include<iomanip>#include<stack>using namespace std;int x[500005],y[500005];long long sum=0;v
2020-11-22 18:46:42 100
原创 FZU2294 Uint47 calculator
FZU2294题意:自己实现加减乘除,其中加减除不会爆long long,但是要自己写乘法。思路:本来以为要类似高精度自己模拟乘法,但是发现乘法其实是多个加法,在加法途中取模就行。于是有了新的方法:用类似快速幂的方法写快速乘核心代码:ll mul_mod(ll x,ll y)//快速乘取模{ ll ans=0; while(y) { if(y&1) ans=(ans+x)%mod; y>>=1; x=(
2020-11-15 22:51:24 99
原创 二分法(板子题)
二分法板子题POJ3273直接上代码:int x[100005];int m,n;bool find(int y){ int tmp=0; int cnt=1;//这里容易出错,最少有一个 for(int i=0;i<n;++i) { if(x[i]>y) return 0; if(x[i]+tmp<=y) { tmp+=x[i]; }
2020-10-10 11:17:27 167
原创 Codeforces Round #663 (Div. 2)C. Cyclic Permutations(单峰序列)
C. Cyclic Permutations题目大意:对于随机排列的序列,找出满足条件的序列数。条件为:在序列里,对于每一个元素,如果它的左边有一个比它大的元素,则他们连一条边,如果它的右边有一个比它大的元素,也连一条边。若这个序列里有环,则满足条件。分析:若有一个元素左右都有比他大的元素,那么那两个元素之间一定有一条边,即存在环,即满足条件。这里要引入单峰序列:若一个序列有一个点,在该点之前,元素是递增的,在该点之后,元素是递减的,则该序列是单峰序列。本题答案即是全排列数-单峰序列数。全排列数:n的
2020-08-11 16:25:28 219
原创 求序列删去至多一个数后的最长连续的递增子序列长度 o(n) Codeforces 1272D
题目链接:Codeforces 1272D两种做法:做法一代码也可以参考自己交过的,那就是做法一做法二
2020-08-09 23:40:21 324
原创 Codeforces Round #584 D. Cow and Snacks
题目链接题目大意: 已知客人总数和不同种类食物的种类数,每个客人选择两种食物并吃完,可以对客人进行适当的排序,问最少有多少客人选择的食物都已被吃完。题解: 一道隐藏较深的并查集。寻找每一个客人所选食物的祖先,若祖先相同,则这位客人选择的食物都被吃完,否则进行Union操作。AC代码:#pragma GCC optimize(2)#pragma GCC optimize(3)#include<stdio.h>#include<stdlib.h>#include&
2020-07-31 13:09:52 199
原创 POJ 6794 Tokitsukaze and Multiple
题目链接题目大意:找出数列中和为k的倍数的连续子序列的最大个数。题解:即为连续,那就考虑前缀数组。得到前缀数组后取模,由其性质可知,值相等的两个前缀数组元素之间的数就是要找的子序列。用map来加速找值相等的一对前缀数组元素。AC代码:#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>#include<cmath>#include<alg
2020-07-28 19:27:21 395
原创 HDU1010
题目链接:HDU1010一道DFS题目,程序种有两点需要注意:1.快速读入数据2.剪枝加速判断代码:#pragma GCC optimize(2)#pragma GCC optimize(3)#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>#include<cmath>#include<algorithm>#includ
2020-07-28 15:10:00 206
原创 POJ1664 放苹果
POJ1664 放苹果Description把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。Input第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。Output对输入的每组数据M和N,用一行输出相应的K。Sample Input17 3Sample Output8题解:用递归解题。比较m和n分两种情况
2020-07-25 10:25:07 94
原创 洛谷P2181 对角线
洛谷P2181 对角线题目链接P2181对角线 一道入门题目,WA了无数次QWQ。 本题也有很多知识点:我最开始找交点是想根据边数->对角线条数->交点个数,但最后失败了。之后之后转变思路:1个交点->2条相交线->4个点。得出结论:原来是计算C4/n。之后就是计算。开数组long long 够吗?不够!可以尝试样例98765,用long long结果是负数,这就说明越界了!unsigned long long 范围是[0,2^64-1],而long long 的范围
2020-07-18 20:38:03 163 3
原创 快速排序
快速排序快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的差时间复杂度和 冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)。其实快速排序是基于一
2020-07-09 15:33:31 128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人