![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm notes
记录算法学习过程中的笔记
DobeQAQ
这个作者很懒,什么都没留下…
展开
-
十四/十五数码难题——BFS
Problem类似于 3 * 3的8数码难题, 此题基于4 * 4矩阵, 14数码+2空位,给定矩阵,要求还原成 1 2 3 4 // 5 6 7 8 // 9 10 11 12 //13 14 0 0求最小步数。SolutionBFS暴搜,通过字符串记录状态。为方便交换,将10-14看成A-E。然后就BFS,找到空位,枚举4方向交换字符串对应位置。PSA*算法实验可以去了解一下Code#include<bits/stdc++.h>#define INF 0x3f3f3原创 2021-04-11 21:18:09 · 553 阅读 · 0 评论 -
求t直线交点个数
Problem直角坐标系下,直线截距式y=kx+b,以截距式(k,b)给定n条直线,求t直线交点的数量(两直线交点、三直线交点。。。) t∈[2,n]Solutionn 1e4, 暴力枚举O(n(n-1)/2) 5e7莽过了,枚举直线交点,判断是否非负,是否整数,对于每个交点的出现次数累加,这里用map记录了。 对于某个交点,组合数C(n,2)为某交点的出现次数,因此在一开始初始化F[1-1e4]=i*(i-1)/2;二分数组找到下标i,即为经过该交点的直线个数,然后ans[1~n]记录直原创 2021-04-10 21:18:15 · 220 阅读 · 0 评论 -
计蒜客38696-Count(构造矩阵+矩阵快速幂)
ProblemFarmer John 有 n 头奶牛.某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:第一头奶牛为 11 号,第二头奶牛为 2 号,第三头奶牛之后,假如当前奶牛是第 n 头,那么他的编号就是 2 倍的第 n−2 头奶牛的编号加上第 n−1 头奶牛的编号再加上自己当前的 n 的三次方为自己的编号.现在 Farmer John 想知道,第 n 头奶牛的编号是多少,估计答案会很大,你只要输出答案对于 123456789 取模.Input第一行输入一个 TT ,表示有 TT 组样例接原创 2021-04-08 20:46:20 · 150 阅读 · 0 评论 -
求阶乘的位数
#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;int T;int n;int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); double cnt=0; for(int i=1;i<=n;i++) cnt+=log10(i);原创 2021-04-08 20:43:51 · 106 阅读 · 0 评论 -
字符串中多少子串是素数p的倍数
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=200005;string s;ll n,dp[maxn],a[maxn],cnt[maxn],vis[maxn],ans=0,p;vector<int>v;int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>p; ci原创 2021-04-08 20:43:05 · 253 阅读 · 0 评论 -
并查集求连通分量个数
#include<bits/stdc++.h>#define maxn 1000005using namespace std;typedef long long ll;int n,m,ans,u,v,fa[maxn];int get(int x){ if(x==fa[x]) return x; return get(fa[x]);}int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) fa原创 2021-04-08 20:41:50 · 243 阅读 · 0 评论 -
Trie树字典树简单运用——T1259:最短前缀
Trie树字典树简单运用——最短前缀例题:计蒜客T1259:最短前缀链接:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1259题目一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 “carbon” 的字串是: “c”, “ca”, “car”, “carb”, “carbo”, 和 “carbon”。注意到这里我们不认为空串是子串, 但是每个非空串是它自身的子串. 我们现在希望能用前缀来缩略的表示单词。例如, “c原创 2021-04-08 20:18:55 · 290 阅读 · 0 评论 -
区间最大子段和——线段树
区间最大子段和#include<bits/stdc++.h>using namespace std;typedef long long ll ;const int maxn=500005;inline ll read() { ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch原创 2021-04-07 19:59:03 · 131 阅读 · 0 评论 -
静态主席树求区间第k小
静态主席树求区间第k小Problem:给定一个含有 n 个数的序列 a1,a2…an,需要支持两种操作:Q l r k 表示查询下标在区间 [l,r] 中的第 k 小的数。C x y 表示将 ax 改为 y。/*给定一个含有 n 个数的序列 a1,a2…an,需要支持两种操作:Q l r k 表示查询下标在区间 [l,r] 中的第 k 小的数。C x y 表示将 ax 改为 y。*/#include<bits/stdc++.h>using namespace std;t原创 2021-04-07 19:57:58 · 140 阅读 · 0 评论 -
kmp next数组求法——子串前缀,后缀,中间出现3次
(题目忘记是哪道了)#include<bits/stdc++.h>using namespace std;string s;int len,nxt[1000005],cnt[1000005];void get_next(string s) { int i=0,j=-1; nxt[0]=-1; int len=s.size(); while(i<len) { if(j==-1||s[i]==s[j]) nxt[++i]=++j; else j=nxt[j]; }原创 2021-04-07 19:56:35 · 123 阅读 · 0 评论 -
线段树区间和(区间修改/区间查询/单点修改/单点查询)
线段树区间和#include<bits/stdc++.h>using namespace std;const int maxn=100005;int n,m,p,ans,x,l,r,val;struct node { int l,r,w,f;//f为延迟标记} tree[4*maxn+5];void build(int k,int l,int r) { //建树 tree[k].l=l,tree[k].r=r; if(tree[k].l==tree[k].r) { sca原创 2021-04-07 19:54:43 · 179 阅读 · 0 评论 -
欧拉筛求第k小素数
#include<bits/stdc++.h>using namespace std;const int maxn=1e8+5;int n,m,x;bool isprime[maxn];int prime[maxn];void Eulen_sieve(int n) { memset(isprime,true,sizeof(isprime)); prime[0]=0; for(int i=2; i<=n; i++) { if(isprime[i])prime[++pri原创 2021-04-07 19:53:35 · 136 阅读 · 0 评论 -
2019分解成若干个素数之和的方案数
2019分解成若干个素数之和的方案数#include<bits/stdc++.h>using namespace std;typedef long long ll;bool vis[3005];ll prime[3005],cnt,dp[3555][3555];ll n=2019,ans;//2019分解成若干个素数之和的方案数 int main() { //欧拉线性筛2019内的素数 for(int i=2; i<=n; i++) { if(!vis[i]) p原创 2021-04-07 19:52:51 · 675 阅读 · 0 评论 -
最长上升子序列
最长上升子序列#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000005;int n,a[maxn],dp[maxn];int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; dp[i]=1; }原创 2021-04-07 19:52:07 · 78 阅读 · 0 评论 -
离散化二维前缀和求平面矩形个数
离散化二维前缀和求平面矩形个数#include<bits/stdc++.h>using namespace std;typedef long long ll;pair<ll,ll>p[2005];vector<ll>x,y;int vis[2005][2005];ll sum[2005][2005];int n;bool cmp(pair<ll,ll>a,pair<ll,ll>b) { if(a.first==b.first)原创 2021-04-07 19:51:14 · 154 阅读 · 0 评论 -
n!在m进制下的后导零个数
#include<bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;int t,n,p;vector<int>prime;int vis[1000005],cnt[1000005];bool check(int a) { if(a==1) return 0; if(a==2||a==3) return 1; if(a%6!=1&&a%6!=5) return 0; int tmp=sqr原创 2021-04-07 19:49:54 · 117 阅读 · 0 评论