
ACM - 模板
模板/模板题
行码棋
ZZUer -> USTCer,退役ACMer。个人站点:wyqz.top
展开
-
怎么求逆序对的数量呢?一种特殊写法告诉你
求逆序对的必备知识离散化可以点离散化学习相关知识点树状数组链接1链接2链接3我们要求逆序对,就要求前面的数比后面的数大的数对有多少个。那么如果我们把每个数前面比它大的数有多少个求出来就可以了,答案就显而易见,就是每个数前面比它大的数的个数的和。那么问题转化为求每个数前面比它大的数的个数。怎么求呢?我们考虑到可以用树状数组tr[]维护一个数组先将原数组进行离散化,因为可能原数组的数据范围很大,数组空间不能开的很大。离散化之后原数组就变成了一个相对大小等级的数。(数小代表这个原创 2021-05-26 10:42:19 · 284 阅读 · 9 评论 -
道路建设(牛客竞赛)(最小生成树prim+kruskal)(详细讲解)
题目链接道路建设题解(最小生成树)kruskal需要掌握的知识(前备知识):1.并查集的使用2.图的边的存储(结构体存储)(还有其他的存储方式,本题以结构体存储为例)kruskal算法步骤:1.首先做好所有的初始化工作:并查集初始化(很容易忘的)结构体存边2.对所有边按权值从小到大进行排序,因为是最小生成树嘛,肯定是从小的权值往大的权值挑选边的。3.对每条边进行遍历,记录当前访问的边的两个的点,查找这两个点的父亲节点,如果两个父亲节点一样,说明他们在一个集合里面,他们之前已经连通原创 2021-05-18 17:25:29 · 670 阅读 · 0 评论 -
小木乃伊到我家(牛客竞赛)(最短路模板题)
题源注意:1.距离要初始化为inf2.边的存储要弄清存储的方式,以及各自代表的含义;比如说pair存储,first代表边的指向的点,second代表边的权值,而数组的第一维代表边的起点。3.优先队列存储的信息要清楚它的作用:存储距离:目的是对距离进行排序,每次取出距离最小的节点,功能只是对队列的节点进行排序。存储节点:目的是为了取出最短距离的节点时,能够获得节点的编号。所以在优先队列里面,存储距离加了个负号,因为优先队列优先对pair的第一个元素进行降序排序,所以为了取出最小距原创 2021-05-15 21:41:04 · 290 阅读 · 0 评论 -
滑动窗口问题
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e6+5;int q[N],a[N],p[N];int main(){ int n,k; cin>>n>>k; //求窗口的最小值 int h = 1,t = 0; for(int i=1;i<=n;++i) cin>>a[i]; fo原创 2021-05-04 20:43:22 · 127 阅读 · 0 评论 -
最长连续不重复子序列(双指针算法)
样例:51 2 3 4 2输出:4#include<bits/stdc++.h>using namespace std;const int N = 1e5+5;int n;int vis[N],a[N];int main(){ cin>>n; int ans = 0; for(int i=1,j=1;i<=n;i++) { cin>>a[i]; vis[a[i]] ++; while(vis[a[i]] > 1).原创 2021-05-04 18:22:04 · 247 阅读 · 0 评论 -
位运算的性质和公式大全
位运算的性质和公式大全一、位运算公式总结二、运算符的性质1.^运算符2.|运算符3.&运算符4.组合性质一、位运算公式总结位运算符解释lowbit(i) 即i&-i返回i的最后一位1n>>k & 1求n的第k位数字x | (1 << k)将x第k位 置为1x ^ (1 << k)将x第k位取反x & (x - 1)将x最右边的1置为0(去掉最右边的1)x | (x + 1)将原创 2021-05-03 21:45:25 · 4681 阅读 · 6 评论 -
快速排序
#include<bits/stdc++.h>using namespace std;const int maxn = 1e5+5;int a[maxn];void qsort(int l,int r){ if(l>=r) return ; int i=l-1,j=r+1,x = a[l+r>>1]; while(i<j) { do i++;while(a[i]<x); do j--;whi原创 2021-04-29 21:07:14 · 115 阅读 · 0 评论 -
归并排序
void merge_sort( int l, int r){ if (l >= r) return; int mid = l + r >> 1; merge_sort( l, mid); merge_sort( mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (a[i] <= a[j])原创 2021-04-17 17:59:23 · 98 阅读 · 0 评论 -
斐波那契数列(高精度)
dp[i][j]代表第i个数的前j位每位的数#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn = 5e3+5;ll dp[5005][1200];int main(){ ll n; cin>>n; if(n==0) cout<<0; dp[1][1] = 1; dp[2][1] = 2; //斐波那契循环 for(int i=3;i<原创 2021-04-07 21:54:58 · 1276 阅读 · 0 评论 -
大整数乘法
#include<iostream>#include<string>#include<sstream>using namespace std;string zero(int n){ if(n==0) return ""; if(n==1) return "0"; return zero(n/2)+zero(n/2)+zero(n%2);}string tostring(int n){ string res; stringstream ss;原创 2021-04-02 20:40:28 · 137 阅读 · 0 评论 -
离散化
unique()函数该函数是把相邻重复的元素中的一个扔到后面。返回值为去重之后最后一个不重复元素的下一个位置的迭代器。关键代码:离散化之后a数组存的是原来数的大小排名,也是b中该数的下标 //b数组用来存放去重后的数据 for (int i = 1; i <= n; i++) { cin >> a[i]; b[i] = a[i];//先赋值 } //必须先排序 sort(b + 1, b + 1 + n)原创 2021-04-01 11:27:11 · 421 阅读 · 0 评论 -
最长上升和公共子序列LCS和LIS(dp)(二分)
n²做法:dp#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn = 1e5+5;ll dp[maxn],a[maxn];void solve(){ memset(dp,0,sizeof(dp)); ll n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i],dp[1] = 1; for原创 2021-04-01 10:48:47 · 204 阅读 · 0 评论 -
线段树模板
建议上B站搜索线段树,播放量最多的那个视频讲的很详细。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1000;int tr[maxn],a[maxn];//建树 void build(int i,int l,int r){ if(l == r) { tr[i] = a[l]; return; } int mid = (l+r) >>原创 2021-03-29 21:55:33 · 140 阅读 · 0 评论 -
快读模板
#include<bits/stdc++.h>using namespace std;typedef long long ll;inline ll read(){ char k = getchar(); ll x = 0,w = 1; while(k < '0' || k > '9') { if(k=='-') { w = -1;//标记为负数 k = getchar(); } } while(k>='0' && k原创 2021-03-29 17:32:16 · 107 阅读 · 0 评论 -
链式前向星(待更新)
#include<bits/stdc++.h>using namespace std;const int maxn = 1005;//点的最大个数 int n,m,cnt;struct Edge{ int to,w,next;}edge[maxn];int head[maxn];//以i为起点的最后一条边的边的编号 void init(){ for(int i=0;i<=n;i++) head[i] = -1; } void add(int u,int v,int原创 2021-03-19 21:55:30 · 108 阅读 · 0 评论 -
质因数分解模板
#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; for(int i=2;i*i<=n;i++) { while(n%i==0) { n/=i; cout<<i; if(n!=1) cout<<"*"; } } if(n!=1) cout<<n; return 0; }原创 2021-03-07 13:42:25 · 252 阅读 · 0 评论 -
素数筛模板
素数筛/*素数筛:1)埃式筛法 O(nlogn) 2)欧拉筛法(线性筛) O(n) */#include<bits/stdc++.h>using namespace std;typedef long long LL;LL st[1000005];LL primes[1000005];LL n; LL sh[1000005],cnt;//埃式筛,12被筛两遍 void getprime(LL n){ for(int i=2;i<=n/i;i++) { i原创 2021-03-07 13:28:01 · 187 阅读 · 0 评论 -
【背包问题】知识点及例题
文章目录1. 01背包2. 完全背包3. 多重背包1. 01背包有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10原创 2021-02-28 10:25:43 · 1116 阅读 · 0 评论