CSP普及组模板整合(自用)

快速幂

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;

int ksm(int b,int p,int k){
    int ans=1;
    while(p){
        if(p&1)
        ans=ans%k*b%k;
        b=b%k*b%k;
        p>>=1;
    }
return ans%k;
}


signed main(){
int b,p,k;
cin>>b>>p>>k;
cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k)%k;


    return 0;     
}

字符串哈希

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int mod=0x7fffffff;
int p=131;
char s[100000];
int h(char *s){
	int l=strlen(s);
	int sum=0;
	for(int i=0;i<l;i++)
	sum=p*sum+(int)s[i];
	return sum%mod;
}

int ans=0,m[100000];

signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
	scanf("%s",s);
	m[i]=h(s);
}
	
sort(m+1,m+n+1);

for(int i=1;i<=n;i++){
	if(m[i]!=m[i-1])
	ans++;	
}
	cout<<ans;
	
	return 0;
	
} 

并查集(路径压缩)

#include <iostream>
#include <cstdio>
using namespace std;
int z, x, y;
int n, m;
int f[10000];

int find(int s) {

    if (f[s] == s)
        return s;

    return f[s] = find(f[s]);

}


int main() {
    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        f[i] = i;
    }


    for (int i = 1; i <= m; i++) {
        cin >> z >> x >> y;

        if (z == 1)
            f[find(x)] = find(y);

        else {
            if (find(x) == find(y))
                cout << "Y" << endl;
            else
                cout << "N" << endl;
        }
    }

    return 0;
}

gcd

int gcd(ll a, ll b){
  if (!b)return a;
  else return gcd(b, a % b);
}

lcm

int lcm(int a,int b){
  return a/gcd(a,b)*b;
}

dijkstra堆优化

#include<bits/stdc++.h>
#define INF 0x7fffffff
#define MAXN 1000086
#define MAXM 2000086
#define int long long
using namespace std;
int n,m,s,head[MAXN],cnt,dis[MAXN];
bool vis[MAXN];
struct edge{
    int w,to,nxt;
}e[MAXM];
struct node{
int dis,id;
    bool operator <(const node& x)const{
        return x.dis<dis;
    }
};
priority_queue<node>q;
void add(int u,int v,int w){
    e[cnt].w=w;
    e[cnt].to=v;
    e[cnt].nxt=head[u];
    head[u]=cnt++;
}



void init(){
for(int i=0;i<=n;i++){
    head[i]=-1;
    e[i].nxt=-1;
}
cnt=0;
}

void dijkstra(){
    dis[s]=0;
    q.push((node){0,s});
    while(!q.empty()){
        node cur=q.top();
        q.pop();
        int x=cur.id;
        int d=cur.dis;
        if(vis[x])continue;
        vis[x]=1;
        for(int i=head[x];~i;i=e[i].nxt){
            int y=e[i].to;
            if(vis[y])continue;
            if(dis[y]>dis[x]+e[i].w){
                dis[y]=dis[x]+e[i].w;
                q.push((node){dis[y],y});
            }
        }
    }
}


signed main(){

cin>>n>>m>>s;
init();
for(int i=0;i<=n;i++){
    dis[i]=INF;
}
int u,v,w;
for(int i=1;i<=m;i++){
    cin>>u>>v>>w;
    add(u,v,w);
}   
dijkstra();
for(int i=1;i<=n;i++)printf("%lld ",dis[i]);


    return 0;
}

链表

struct node
{
	int next,pre;
	int v;
};

node z[233333];

//i->k
//i->j->k
void insert(int i,int j)//编号为j的节点插入到编号为i的节点后面
{//O(1)
	int k=z[i].next;
	z[i].next=j;
	z[j].next=k;
	z[k].pre=j;
	z[j].pre=i;
}

//j->i->k
//j->k
void del(int i)
{//O(1)
	int j=z[i].pre;
	int k=z[i].next;
	z[j].next=k;
	z[k].pre=j;
}

int query(int i)//询问链表第i个元素的值
{
	int p=head;
	for (int j=1;j<i;j++)
		p=z[p].next;
	return z[p].v;
}

void modify(int i,int v)//将链表第i个元素的值改为v
{
	int p=head;
	for (int j=1;j<i;j++)
		p=z[p].next;
	z[p].v=v;
}


posted @ 2022-09-20 15:30  DAIANZE  阅读(64)  评论(0编辑  收藏  举报