zoukankan      html  css  js  c++  java
  • contest 1.22

    D.菱菱的旅途

    排序

    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
     
    struct Node{
      ll v,id;
    }node[1000005];
     
    bool cmp(Node a,Node b){
      if(a.v!=b.v) return a.v>b.v;
      else return a.id>b.id;
    }
     
    int main()
    {
        ll n;scanf("%lld",&n);
        for(ll i=1;i<=n;i++) scanf("%lld",&node[i].v),node[i].id=i;
        sort(node+1,node+1+n,cmp);
        ll max_id=-1,min_id=n+1,ans=0;
        for(ll i=1;i<=n;i++){
            max_id=max(max_id,node[i].id);
            min_id=min(min_id,node[i].id);
            ll now=node[i].v*max(max_id-node[i].id+1,node[i].id-min_id+1);
            ans=max(ans,now);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code

    A.桥桥的告白

     模拟

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    char name[1005][35];
    
    struct Node{
      int cnt,id;
    }node[1005];
    
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",name[i]);
            node[i].cnt=0;
            node[i].id=i;
        }
        int m;scanf("%d",&m);
        for(int i=1;i<=m;i++){
            int u,v;scanf("%d%d",&u,&v);
            node[u].cnt=node[v].cnt+1;
            node[u].id=node[v].id;
        }
        for(int i=1;i<=node[1].cnt;i++){
            printf("I_love_");
        }
        puts(name[node[1].id]);
        return 0;
    }
    View Code

    E.鑫鑫的算术

    A.慢跑

    单调队列

    #include <iostream>
    #include<cstdio>
    #include<stack>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
     
    ll p[100005],v[100005],d[100005];
    stack<ll> stk;
     
    int main()
    {
        ll n,t;scanf("%lld%lld",&n,&t);
        for(ll i=1;i<=n;i++){
            scanf("%lld%lld",&p[i],&v[i]);
            d[i]=p[i]+v[i]*t;
        }
        ll ans=n;
        for(ll i=1;i<=n;i++){
            while(!stk.empty()){
                ll top=stk.top();
                if(top>=d[i]) {
                  ans--;
                  stk.pop();
                }
                else break;
            }
            stk.push(d[i]);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code

    D.迷宫问题

    dfs暴力

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    typedef long long ll;
    using namespace std;
     
    ll n;
    char Map[105][105];
    ll vis[105][105];
    int dire[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};
     
    bool in(ll x,ll y){return x>=1&&x<=n&&y>=1&&y<=n;}
     
    ll dfs(ll x,ll y){
      if(x==1&&y==n) return 1;
      else{
        ll ret=0;
        for(ll i=0;i<8;i++){
            ll nx=x+dire[i][0];
            ll ny=y+dire[i][1];
            if(in(nx,ny)&&Map[nx][ny]=='0'&&!vis[nx][ny]) {
                vis[nx][ny]=1;
                ret+=dfs(nx,ny);
                vis[nx][ny]=0;
            }
        }
        return ret;
      }
    }
     
    int main()
    {
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++){
            for(ll j=1;j<=n;j++){
                scanf(" %c",&Map[i][j]);
            }
        }
        ll ans=0;
        if(Map[1][1]=='0'){
            vis[1][1]=1;
            ans=dfs(1,1);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code

    E.星区

    并查集

    #include <iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
     
    int x,y,z,m;
    int d[55][55][55];
    int id[55][55][55],tot=0;
    int fa[125005];
    int ans;
     
    inline int get_id(int a,int b,int c){return id[a][b][c];}
     
    inline bool in(int a,int b,int c){return a>=1&&a<=x&&b>=1&&b<=y&&c>=1&&c<=z;}
     
    inline int findd(int x){
      if(x==fa[x]) return x;
      else return fa[x]=findd(fa[x]);
    }
     
    inline void cal(int a,int b,int c){
      int now=d[a][b][c];
      int id1=get_id(a,b,c);
      int fa1=findd(id1);
      if(in(a-1,b,c)&&abs(d[a-1][b][c]-now)<=m){
        int id2=get_id(a-1,b,c);
        int fa2=findd(id2);
        if(fa1!=fa2) fa[fa2]=fa1,ans--;
      }
      if(in(a,b-1,c)&&abs(d[a][b-1][c]-now)<=m){
        int id2=get_id(a,b-1,c);
        int fa2=findd(id2);
        if(fa1!=fa2) fa[fa2]=fa1,ans--;
      }
      if(in(a,b,c-1)&&abs(d[a][b][c-1]-now)<=m){
        int id2=get_id(a,b,c-1);
        int fa2=findd(id2);
        if(fa1!=fa2) fa[fa2]=fa1,ans--;
      }
    }
     
    int main()
    {
        scanf("%d%d%d",&x,&y,&z);
        scanf("%d",&m);
        for(int i=1;i<=x;i++){
            for(int j=1;j<=y;j++){
                for(int k=1;k<=z;k++){
                    scanf("%d",&d[i][j][k]);
                    id[i][j][k]=++tot;
                    fa[tot]=tot;
                }
            }
        }
        ans=x*y*z;
        for(int i=1;i<=x;i++){
            for(int j=1;j<=y;j++){
                for(int k=1;k<=z;k++){
                    cal(i,j,k);
                    //printf("(%d,%d,%d) %d
    ",i,j,k,ans);
                }
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    /*
    2 2 2
    0
    5 1 1 1 2 2 2 2
    */
    View Code

    B.游济南

    ans=2*总权值-距1的最远距离

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    typedef long long ll;
    using namespace std;
     
    struct Edge{ll v,w;};
    vector<Edge> edge[50005];
    ll vis[500005];
    ll maxn=0;
     
    void dfs(ll x,ll tot){
      maxn=max(maxn,tot);
      ll siz=edge[x].size();
      vis[x]=1;
      for(ll i=0;i<siz;i++){
        ll v=edge[x][i].v;
        ll w=edge[x][i].w;
        if(vis[v]) continue;
        dfs(v,tot+w);
      }
    }
     
    int main()
    {
        ll n;scanf("%lld",&n);
        ll tot=0;
        for(ll i=1;i<=n-1;i++){
            ll u,v,w;scanf("%lld%lld%lld",&u,&v,&w);
            edge[u].push_back(Edge{v,w});
            edge[v].push_back(Edge{u,w});
            tot+=w;
        }
        dfs(1,0);
        printf("%lld
    ",tot*2-maxn);
        return 0;
    }
    View Code

    C.飞行

    单源最短路

    #include <iostream>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cstring>
    #define inf 0x3f3f3f3f3f3f3f3f
    typedef long long ll;
    using namespace std;
    
    ll r,s,p,n,m;
    struct Edge{ll v,len;};
    vector<Edge> edge[40005];
    struct Node{
        ll v,dis;
        bool operator <(const Node& b)const{
            return dis>b.dis;
        }
    };
    ll ans[3][40005];
    
    void dijkstra(ll s){
       priority_queue<Node> q;
       q.push(Node{s,0});
       if(s==n) s=0;
       memset(ans[s],0x3f3f,sizeof(ans[s]));
       while(!q.empty()){
         Node now=q.top();q.pop();
         ll u=now.v,dis=now.dis;
         if(dis>=ans[s][u]) continue;
         ans[s][u]=dis;
         ll siz=edge[u].size();
         for(ll i=0;i<siz;i++){
            ll v=edge[u][i].v;
            ll len=edge[u][i].len;
            if(dis+len<ans[s][v]) q.push(Node{v,dis+len});
         }
       }
    }
    int main()
    {
        scanf("%lld%lld%lld%lld%lld",&r,&s,&p,&n,&m);
        for(ll i=1;i<=m;i++){
            ll u,v;scanf("%lld%lld",&u,&v);
            edge[u].push_back(Edge{v,1});
            edge[v].push_back(Edge{u,1});
        }
        dijkstra(1);
        dijkstra(2);
        dijkstra(n);
        ll tmp1=ans[1][n]*r+ans[2][n]*s;
        ll tmp2=inf;
        for(ll i=1;i<=n;i++){
            ll now=ans[1][i]*r+ans[2][i]*s+ans[0][i]*p;
            tmp2=min(tmp2,now);
        }
        printf("%lld
    ",min(tmp1,tmp2));
        return 0;
    }
    View Code

    F.小迟的数字I

    转载请注明出处:https://www.cnblogs.com/lllxq/
  • 相关阅读:
    多进程要时刻当心的点
    pairs和ipairs用的迭代器不一样
    #pragma pack(push,1) & #pragma pack(pop)
    负数取模不一定是正数
    切记一定要get~
    GAME有计时器,大厅没有计时器的原因
    每天一个linux命令(1):ls命令
    服务端发的某个short字段存到buf里是正值,存完在看就是0的问题
    生成函数&多项式全家桶导学案
    [Z]董的博客数据结构与算法汇总
  • 原文地址:https://www.cnblogs.com/lllxq/p/10305057.html
Copyright © 2011-2022 走看看