• AtCoder Grand Contest 013


    这场打得蛮菜的,很晚才出BC,还一堆罚时……

    A - Sorted Arrays

    题目大意:将给定数列划分成单调不增或单调不减的区间,求最少区间数。

    贪心即可。

    #include<cstdio>
    #include<algorithm>
    #define MN 1000001
    using namespace std;
     
    int read_p,read_ca;
    inline int read(){
        read_p=0;read_ca=getchar();
        while(read_ca<'0'||read_ca>'9') read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p;
    }
    const int MOD=1e9+7;
    int n,a[MN],m=0,mmh=0;
    int main(){
        int i,j;
        n=read();
        for (i=1;i<=n;i++) a[i]=read();
        for (i=2;i<=n;i++){
            if (a[i]==a[i-1]) continue;
            if (m==-1&&a[i]>a[i-1]) mmh++,m=0;else
            if (m==1&&a[i]<a[i-1]) mmh++,m=0;else
            m=a[i]>a[i-1]?1:-1;
        }
        printf("%d
    ",mmh+1);
    }
    View Code

    B - Hamiltonish Path

    题目大意:无向图中任意求一条路径,使得与端点直接相连的所有点都在路径上。

    一条不合法的路径就是端点可以继续往外拓展的路径。那么直接从一个点出发,拓展两次,把两次的终点作为端点即可。

    因为输出顺序写错卡了好久。

    #include<cstdio>
    #include<algorithm>
    #define MN 400001
    using namespace std;
     
    int read_p,read_ca;
    inline int read(){
        read_p=0;read_ca=getchar();
        while(read_ca<'0'||read_ca>'9') read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p;
    }
    const int MOD=1e9+7;
    int n,a[MN],m=0,mmh=0,x,y,l[MN],r,st[MN],top=0,_st[MN],_top=0,num;
    struct na{int y,ne;}b[MN<<1];
    inline void in(int x,int y){b[++num].y=y;b[num].ne=l[x];l[x]=num;}
    bool bo[MN];
    void dfs(int p){
        st[++top]=p;
        bo[p]=1;
        for (int i=l[p];i;i=b[i].ne)
        if (!bo[b[i].y]) {dfs(b[i].y);break;}
    }
    void _dfs(int p){
        _st[++_top]=p;
        bo[p]=1;
        for (int i=l[p];i;i=b[i].ne)
        if (!bo[b[i].y]) {_dfs(b[i].y);break;}
    }
    int main(){
        int i;
        n=read();m=read();
        for (i=1;i<=m;i++) x=read(),y=read(),in(x,y),in(y,x);
        dfs(1);
        _dfs(1);
        printf("%d
    ",top+_top-1);
        for (i=top;i;i--) printf("%d ",st[i]);
        for (i=2;i<=_top;i++) printf("%d ",_st[i]);
    }
    View Code

    C - Ants on a Circle

    题目大意:一个环上一些蚂蚁在走,有顺逆时针两种方向,一秒走一步,相撞都掉头,问T秒后每只的位置。

    先把相撞掉头这点换成交换编号,然后就不会做惹T_T

    幸得tjw神犇相救。

    回到原问题就比较容易看出,蚂蚁的相对位置是不变的。那么对最终位置排序并统计蚂蚁走了多少圈(跨过L-1与0的分界多少次),在对应的下标上移动即可。

    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #define MN 110001
    using namespace std;
     
    int read_p,read_ca;
    inline int read(){
        read_p=0;read_ca=getchar();
        while(read_ca<'0'||read_ca>'9') read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p;
    }
    int n,l,t,p[MN],w[MN];
    long long T=0;
    int main(){
        register int i;
        n=read();l=read();t=read();
        for (i=0;i<n;i++) p[i]=read(),w[i]=read();
        for (i=0;i<n;i++) p[i]+=w[i]==1?t:-t,T+=p[i]/l,p[i]%=l;
        for (i=0;i<n;i++) if (p[i]<0){
            T--;
            p[i]+=l;
        }
        sort(p,p+n);T%=n;
        for (i=0;i<n;i++) printf("%d
    ",p[(i+T+n)%n]);
    }
    View Code
  • 相关阅读:
    疫情期间刷题列表
    P3379 【模板】最近公共祖先(LCA)
    P3865 【模板】ST 表
    Distance Queries
    Frequent values
    P3388 【模板】割点(割顶)
    P1168 中位数
    单链表排序
    大数据各组件重要技术点总结
    Flink CDC同步MySQL分库分表数据到Iceberg数据湖实践
  • 原文地址:https://www.cnblogs.com/Enceladus/p/6726783.html
Copyright © 2020-2023  润新知