• NOIP前模板整理


    最短路径

    #include <queue>
    #define N 1000
    typedef long long ll;
    using namespace std;
    int d[N], w[N][N], num[N];
    ll dis[N];
    queue<int> que;
    void spfa(){
        for (int i=1;i<=n;i++) dis[i]=0x7fffff;
        que.push(1);d[1]=0;dis[1]=0;
        do{
            int h=que.front();
            d[h]=1,que.pop();
            for (int i=1,v;i<=num[h];i++){
                v = s[h][i];
                if (dis[v] > dis[h] + w[h][s[v]]) {
                    dis[v] = dis[h] + w[h][v];
                    if (!d[v]) que.push(v),d[v]=0;
                }
            }
        }while(!que.empty())
    }
    spfa
    void floyd(){
        for (int k=1;k<=n;k++) {
            for (int i=1;i<=n;i++) {
                for (int j=1;j<=n;j++){
                    if (a[i][j] > a[i][k]+a[k][j]){
                        a[i][j] = a[i][k]+a[k][j];
                    }
                }
            }
        }
    } 
    floyd
    struct Node {
        int id,dis;
        bool operator < (const Node& rhs) const{
            return dis>rhs.dis;
        }
    };
    priority_queue<Node> q;
     
    int vis[N],dis[N];
    void dijkstra(int s){
        q.push((Node){s,0});
        while(!q.empty()) {
            int u=q.top().id;
            if(vis[u]) continue;
            vis[u]=1;
            trav(u,i) {
                int v=e[i].v;
                if(dis[v]>dis[u]+e[i].w) {
                    dis[v]=dis[u]+e[i].w;
                    q.push((Node){v,dis[v]});
                }
            }
        }
    }
    dijkstra

    LCA

    #define N 100005
    #define D 21
    struct Edge {
        int v,nxt;
    }e[M];
    int en=1,front[N];
    void adde(int u,int v){
        e[++en]=(Edge){v,front[u]}; front[u]=en;
    }
     
    int fa[N][D],dep[N];
     
    void dfs(int u){
        for(int i=1;i<D;i++)
            fa[u][i]=fa[fa[u][i-1]][i-1];
        trav(u,i) {
            int v=e[i].v;
            if(v!=fa[u][0]) {
                fa[v][0]=u;
                dep[v]=dep[u]+1;
                dfs(v);
            }
        }
    }
    int lca(int u,int v)
    {
        if(dep[u]<dep[v]) swap(u,v);
        int t=dep[u]-dep[v];
        for(int i=0;i<D;i++)
            if(t&(1<<i)) u=fa[u][i];
        if(u==v) return u;
        for(int i=D-1;i>=0;i--)
            if(fa[u][i]!=fa[v][i])
                u=fa[u][i],v=fa[v][i];
        return fa[u][0];
    }
    int main(){
        //input
        while(t--){
            scanf("%d%d", &u,&v);
            printf("%d
    ", dep[u]+dep[v]-2*dep[lca(u,v)]);
        }
    }
    倍增

    RMQ

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #define maxn 50005
    using namespace std;
    int x, y, t, s, k;
    int fa[maxn][20], fi[maxn][20], n, q, a[maxn];
    void rmq(){
        for (int i=1;i<=n;i++) fa[i][0] = a[i], fi[i][0] = a[i];
        for (int i=1;i<=floor(log(n)/log(2));i++)
            for (int j=1;j<=n+1-(1<<i);j++){
                fa[j][i] = max(fa[j][i-1], fa[j+(1<<i-1)][i-1]);
                fi[j][i] = min(fi[j][i-1], fi[j+(1<<i-1)][i-1]);
            }
    } 
    int main(){
        while(scanf("%d%d", &n,&q)!=EOF){
            for (int i=1;i<=n;i++) scanf("%d",&a[i]);
            rmq();
            for (int i=1;i<=q;i++){
                scanf("%d%d",&x,&y);
                k = (int)(log(y-x+1.0)/log(2.0));
                t=max(fa[x][k],fa[y-(1<<k)+1][k]),s=min(fi[x][k],fi[y-(1<<k)+1][k]);
                printf("%d
    ",t-s);
            }
        }
        return 0;
    } 
    rmq

    输入输出优化

    void read(int& x) {
        char c=getchar(); 
        while(!isdigit(c)) c=getchar();
        x=0;
        while(isdigit(c)) x=x*10+c-'0' , c=getchar();
    }
    read()
  • 相关阅读:
    测试计划
    团队项目需求分析
    团队成员分工及绩效评估
    结对项目之五子棋游戏
    .net web service 参数类型
    ipad webapp 左右分栏 webview的问题
    研究生阶段开始认真写Blog
    [小明学Shader]15.基于Grid的地形混合shader
    [Unity]浅谈AssetBundle的依赖关系打包与加载
    [小明学Shader]光栅化渲染器
  • 原文地址:https://www.cnblogs.com/zhangone/p/6070422.html
Copyright © 2020-2023  润新知