洛谷模板大汇总(可能敲不完了qaq)

前言

  哇!突然发现搜索‘模板’能搜到一坨。。。开始了默默刷模板的漫长之路。。。就让我最后在挣扎一下下吧!!!

  待续。。。持续更新中。。。

板砸们

1、P1177 【模板】快速排序

直通

好吧,不可相信这也是个模板。。

虽然说的那么。。那什么。。可是,真的不想自己弄唉(STL大法好)

代码酱=v=

①sort大法好!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int n;
long long a[100010];

int main() {
    scanf("%d",&n);
    for(int i=0; i<n; i++) scanf("%lld",&a[i]);
    sort(a,a+n);
    for(int i=0; i<n; i++) printf("%lld ",a[i]);
    return 0;
}

②真板子

——快速排序

#include <iostream>
#include <cstdio>
#include <algorithm>
#define mid ((l+r)>>1)
#define LL long long
using namespace std;

int n;
LL a[100010];

void Mysort(int l,int r) {
    int i=l,j=r,m=a[mid];
    while(i<=j) {
        while(a[i]<m) i++;
        while(a[j]>m) j--;
        if(i<=j) {
            LL tmp=a[i];
            a[i]=a[j],a[j]=tmp;
            i++,j--;
        }
    }
    if(l<j) Mysort(l,j);
    if(i<r) Mysort(i,r);
}

int main() {
    scanf("%d",&n);
    for(int i=0; i<n; i++) scanf("%lld",&a[i]);
    Mysort(0,n-1);
    for(int i=0; i<n; i++) printf("%lld ",a[i]);
    return 0;
}

——归并排序

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

const int M = 100010;
int n;
LL a[M],b[M];

void gsort(int l,int r) {
    if(l==r) return;
    int mid=l+r>>1;
    gsort(l,mid),gsort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid && j<=r) {
        if(a[i]<=a[j]) b[k++]=a[i++];
        else b[k++]=a[j++];
    }
    while(i<=mid) b[k++]=a[i++];
    while(j<=r) b[k++]=a[j++];
    for(int q=l; q<=r; q++) a[q]=b[q];
}

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
    gsort(1,n);
    for(int i=1; i<=n; i++) printf("%lld ",a[i]);
    return 0;
}


2、P1439 【模板】最长公共子序列

直通

  我以前原来没做过qaq,这样的板子题。。意会了好久233

思路

  我们可以以第一个串为标准,用第二个串来匹配第一个串,看能匹配多少。

  所以,其实第一个串的每个数字其实影响不大,只有知道它对应了第二串的哪个数字就行,然后最后只要求一下上升序列就好辣~

代码酱qaq

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int M = 100010;
int n,len;
int a[M],b[M],belong[M];

int main() {
    scanf("%d",&n);
    //离散化一下
    for(int i=1,x; i<=n; i++) {
        scanf("%d",&x);
        belong[x]=i;
    }
    for(int i=1,x; i<=n; i++) {
        scanf("%d",&x);
        a[i]=belong[x];
    }
    for(int i=1; i<=n; i++) { //find上升序列
        if(a[i]>b[len]) {
            b[++len]=a[i];
            continue;
        }
        int k=lower_bound(b+1,b+1+len,a[i])-b;
        b[k]=a[i];
    }
    printf("%d\n",len);
    return 0;
}


3.P3390 【模板】矩阵快速幂

直通

今天刚学会qaq,考前的学新东西之一233

具体的嘛~我表示,只会背过+推矩阵

代码酱=w=

#include <iostream>
#include <cstdio>
typedef long long LL;
using namespace std;

inline LL readl() {
    LL x=0,f=1; char c=getchar();
    while(c<‘0‘ || c>‘9‘) { if(c==‘-‘) f=-1; c=getchar(); }
    while(c>=‘0‘ && c<=‘9‘) x=x*10+c-‘0‘,c=getchar();
    return x*f;
}

const int Mod = 1000000007;
LL n,m,i,j,k;
struct A {
    LL a[105][105];
    inline A operator * (const A &b) const {
        A ret;
        for(LL i=1; i<=n; i++)
            for(LL j=1; j<=n; j++) {
                ret.a[i][j]=0;
                for(LL k=1; k<=n; k++)
                    ret.a[i][j]+=a[i][k]*b.a[k][j],
                    ret.a[i][j]%=Mod;
            }
        return ret;
    }
}q;

A ksm(A a,LL x) {
    A ret,k;
    ret=a,k=a;
    x--;
    for(; x; x>>=1,k=k*k)
        if(x&1) ret=ret*k;
    return ret;
}

int main() {
    n=readl();m=readl();
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            q.a[i][j]=readl();
    q=ksm(q,m);
    for(i=1; i<=n; i++) {
        for(j=1; j<n; j++) printf("%d ",q.a[i][j]);
        printf("%d\n",q.a[i][n]);
    }
    return 0;
}


4.P1939 【模板】矩阵加速(数列)

直通

思路

先看这个特征方程F[i] = F[i - 1] + F[i - 3],那么就有一个矩阵如下

我们的目标矩阵就是

那么,针对这个矩阵我们如何转置呢?

先看目标矩阵第一个:F[i]

F[i] = F[i - 1] + F[i - 3]

那么,由矩阵乘法,转置矩阵第一行,似乎就定了:1 0 1

同样的,二三行就是1 0 0 和 0 1 0

整个矩阵如下:

至于转置矩阵和初始矩阵的用法?

矩阵快速幂什么各种杂七杂八的

直通

代码酱_(:з」∠)_

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

inline LL read() {
    LL x=0,f=1; char c=getchar();
    while(c<‘0‘ || c>‘9‘) { if(c==‘-‘) f=-1; c=getchar(); }
    while(c>=‘0‘ && c<=‘9‘) x=x*10+c-48,c=getchar();
    return x*f;
}

const int Mod = 1000000007;
LL T,n;
struct Q {
    LL a[5][5];
    Q operator * (const Q &b) const {
        Q ret;
        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++) {
                ret.a[i][j]=0;
                for(int k=1; k<=3; k++)
                    ret.a[i][j]+=a[i][k]*b.a[k][j];
                    ret.a[i][j]%=Mod;
            }
        return ret;
    }
}A,B;

inline Q ksm(Q A,LL x) {
    Q ret=A,k=A;
    x--;
    for(; x; x>>=1,k=k*k)
        if(x&1) ret=ret*k;
    return ret;
}

int main() {
    T=read();
    while(T--) {
        n=read();
        if(n<=3) {
            printf("1\n");
            continue;
        }
        else {
            A.a[1][1]=A.a[1][3]=A.a[2][1]=A.a[3][2]=1;
            A.a[1][2]=A.a[2][2]=A.a[2][3]=A.a[3][1]=A.a[3][3]=0;
            B.a[1][1]=B.a[1][2]=B.a[1][3]=1;
            Q P=ksm(A,n);
            printf("%lld\n",P.a[1][3]);
        }
    }
    return 0;
} 


5.P3367 【模板】并查集

直通

呼~今天刚整理了这个qaq,还好还有印象。。。

代码酱(≧▽≦)/

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 10010;
int n,m;
int dad[N];

inline int getdad(int x) {
    return x == dad[x] ? x : dad[x]=getdad(dad[x]);
}

inline void Union(int u,int v) {
    int f1=getdad(u),f2=getdad(v);
    if(f1!=f2) dad[f1]=f2;
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) dad[i]=i;
    for(int i=1,x,u,v; i<=m; i++) {
        scanf("%d%d%d",&x,&u,&v);
        if(x==1) {
            Union(u,v);
        }
        else {
            int f1=getdad(u),f2=getdad(v);
            if(f1!=f2) printf("N\n");
            else printf("Y\n");
        }
    }
    return 0;
}


6.P3372 【模板】线段树 1

直通

坑点

第一次交上竟然WA了qaq,我我我我原来是更新区间的时候忘记乘以长度了qaq,再犯蠢就打我自己qaq

代码酱TAT

#include <iostream>
#include <cstdio>
#define mid ((l+r)>>1)
#define lson rt<<1
#define rson rt<<1|1
#define LL long long
using namespace std;

const int M = 100001;
int n,m,a,b,x,s[M];
LL ans;
struct Tree {
    LL l,r,w,f;
} t[M<<2];

inline void update(int rt) {
    int l=t[rt].l,r=t[rt].r;
    t[rt].w=t[lson].w+t[rson].w;
}

inline void build(int rt,int l,int r) {
    t[rt].l=l,t[rt].r=r,t[rt].f=0;
    if(l==r) {
        t[rt].w=s[l];
        return ;
    }
    build(lson,l,mid);
    build(rson,mid+1,r);
    update(rt);
}

inline void down(int rt) {
    int l=t[rt].l,r=t[rt].r;
    t[lson].f+=t[rt].f;
    t[rson].f+=t[rt].f;
    t[lson].w+=t[rt].f*(t[lson].r-t[lson].l+1);
    t[rson].w+=t[rt].f*(t[rson].r-t[rson].l+1);
    t[rt].f=0;
}

inline void addq(int rt) {
    int l=t[rt].l,r=t[rt].r;
    if(a<=l && r<=b) {
        t[rt].f+=x;
        t[rt].w+=(t[rt].r-t[rt].l+1)*x;
        return ;
    }
    if(t[rt].f) down(rt);
    if(a<=mid) addq(lson);
    if(b>mid) addq(rson);
    update(rt);
}

inline void asksum(int rt) {
    int l=t[rt].l,r=t[rt].r;
    if(a<=l && r<=b) {
        ans+=t[rt].w;
        return ;
    }
    if(t[rt].f) down(rt);
    if(a<=mid) asksum(lson);
    if(b>mid) asksum(rson);
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) scanf("%lld",&s[i]);
    build(1,1,n);
    for(int i=1,q; i<=m; i++) {
        scanf("%d",&q);
        if(q==1) {
            scanf("%d%d%d",&a,&b,&x);
            addq(1);
        }
        else {
            scanf("%d%d",&a,&b);
            asksum(1);
            printf("%lld\n",ans);
            ans=0;
        }
    }
    return 0;
}

时间: 2024-07-31 08:28:52

洛谷模板大汇总(可能敲不完了qaq)的相关文章

洛谷 P2008 大朋友的数字

P2008 大朋友的数字 题目背景 在NOIP2013的赛场上,常神牛华丽丽的手残了,小朋友的数字一题只得了10分.于是,他要恶搞一下这道题. 题目描述 有一批大朋友(年龄15岁以上),他们每人手上拿着一个数字,当然这个数字只有1位,也就是0到9之间.每个大朋友的分数为在他之前的最长不下降子序列中所有数之和.(这个序列必须以它作为结尾!)如有多个最长不下降子序列,那么取编号字典序最小的.现在告诉你有n个大朋友,以及他们各自的数字,请你求出他们每个人的分数. 输入输出格式 输入格式: 输入文件为b

洛谷 洛谷 P1011 车站 Label:续命模拟QAQ 未知50分

题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站)上.下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律.现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车).试问x站开出时车上的人数是多少? 输入输出格式 输入格式:

树链剖分[模板](洛谷 P3384)

洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 如果这三个知识点没掌握好的话,树链剖分难以理解也是当然的. 树链剖分 树链剖分 就是对一棵树分成几条链,把树形变为线性,减少处理难度 概念 dfs1() dfs2() 对剖过后的树建线段树 处理问题 概念 重儿子:对于每一个非叶子节点,它的儿子中 儿子数量最多的那一个儿子 为该节点的重儿子 轻儿子:对于每一个非叶子节点,它的儿子中 非重儿子 的剩下所有儿子即为轻儿子 叶子节点没有重儿子

在洛谷3369 Treap模板题 中发现的Splay详解

本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原理来进行的.可能会有不妥之处,还请大佬们指出,谢谢! 那么这个题解存在的意义就是让不会敲Splay的人额...会敲Splay啦... 基本思想 数据结构 对于Splay,我定义了一个class类(当成struct就行啦...个人习惯不同啦),定义名称为“Splay”. 之后在类中,我定义了Splay

洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

HDU-1686 P3375 kmp介绍: http://www.cnblogs.com/SYCstudio/p/7194315.html http://blog.chinaunix.net/uid-8735300-id-2017161.html(mp&kmp) http://www-igm.univ-mlv.fr/~lecroq/string/node8.html(mp&kmp,看上去很正确的例程) http://blog.csdn.net/joylnwang/article/detai

网络流最大流模板(洛谷3376)——Dinic

小道消息,据说NOIP 2017 的六个题是三位(前?)国家队大神出的,所以难度很有可能贼高,并且可能出现网络流,所以慌慌张张地来打了个Dinic 模板,但愿汝佳所说“在大多数比赛中已经完全够用了”是对的. 1 #include<queue> 2 #include<vector> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib

洛谷 P1439 【模板】最长公共子序列

神TM模板..我本来想休闲一下写点水题的... 开始做的时候直接敲了一个O(N2)的算法上去,编译的时候才发现根本开不下.. 好了,谈回这道题. 先不加证明的给出一种算法. 若有一组数据 2 4 2 5 1 3 2 5 4 1 3 那么我们令 4 2 5 1 3 | | | | | 1 2 3 4 5 第三行的数据就变成 2 3 1 4 5 很明显,答案是这个数据的最长上升子序列,即4 == 2 3 4 5,即原数列的2 5 1 3. 现在来大概的介绍一下这样做的原因. 首先,观察题目,注意到这

洛谷P3385 【模板】负环 DFS-SPFA 判负环 图论

洛谷P3385 [模板]负环 图论 今天get了 一个 DFS-SPFA 判负环的方法 一般的 BFS-SPFA 判负环 一般就是 不停地做,如果某点第 n+1次加入队列中,那么说明这个图存在负环然而我并不会证明,期望复杂度是 O(kM) k 大约是在 2 左右 但是其实对于一些极限数据,最坏可以把他卡到 O( NM) 额,这就直接炸飞了是不是,而且据说,一些数据比较强的题目,总会想到卡一卡SPFA的, 然后我们换一种思路 因为题目中一定存在一种 负环对吧,所以说假如你某段路径权值和为自然数的时

洛谷P3372 【模板】线段树 1

P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接