zoukankan      html  css  js  c++  java
  • codeforces 1214

    D

    比赛的时候居然看漏了条件。。。

    若在(x, y)格子,那么只能移动到(x+1, y)或(x, y+1)

    这样的话就好做了,直接dp,然后统计每一种路径长度经过的点数。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<stack>
    #include<set>
    #include<bitset>
    
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> pii;
    #define pb(x) push_back(x)
    #define cls(x, val) memset(x, val, sizeof(x))
    #define fi first
    #define se second
    #define mp(x, y) make_pair(x, y)
    #define inc(i, l, r) for(int i=l; i<=r; i++)
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e6+10;
    char a[maxn], b[maxn];
    int n, m;
    bool vis[maxn], vis1[maxn];
    
    void bfs(int x, int y, bool *vis){
        vis[x*m+y] = true;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(a[i*m+j] == '#') continue;
                if(i>=1&&vis[(i-1)*m+j]) vis[i*m+j] = true;
                if(j>=1&&vis[i*m+j-1]) vis[i*m+j] = true;
            }
        }
    }
    
    void bfs1(int x, int y, bool *vis){
        vis[x*m+y] = true;
        for(int i=n-1; i>=0; i--){
            for(int j=m-1; j>=0; j--){
                if(a[i*m+j] == '#') continue;
                if(i<n-1&&vis[(i+1)*m+j]) vis[i*m+j] = true;
                if(j<m-1&&vis[i*m+j+1]) vis[i*m+j] = true;
            }
        }
    }
    
    int diag[maxn];
    
    int main(){
        ios::sync_with_stdio(false);
        scanf("%d%d", &n, &m);
        for(int i=0; i<n; i++){
            scanf("%s", b);
            for(int j=0; j<m; j++)
                a[i*m+j]=b[j];
        }
        bfs(0, 0, vis);
    //    for(int i=0; i<n; i++){
    //        for(int j=0; j<m; j++){
    //            cout<<vis[i*m+j]<<" ";
    //        }
    //        cout<<endl;
    //    }
        bfs1(n-1, m-1, vis1);
    //    for(int i=0; i<n; i++){
    //        for(int j=0; j<m; j++){
    //            cout<<vis1[i*m+j]<<" ";
    //        }
    //        cout<<endl;
    //    }
        if(vis[(n-1)*m+m-1]==false) {
            printf("0
    ");
            return 0;
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(vis[i*m+j]&&vis1[i*m+j]){
                    //路径长度为i+j经过的点数
                    diag[i+j]++;
                }
            }
        }
    
        for(int i=1; i<n+m-2; i++){
            if(diag[i] == 1){
                printf("%d
    ", 1);
                return 0;
            }
        }
        printf("%d
    ", 2);
        return 0;
    
    }
    
    

    E 构造

    构造一棵树,使得2i与2i-1两个节点之间的权重为di.

  • 相关阅读:
    ▶ 0001 No application 'E:wwwgolog' found in your GOPATH
    beego路由
    go sync.WaitGroup
    idea修改filetype
    deepin添加设置快捷键
    mysql数据库被攻击
    linux桌面系统的约定
    deepin把vscode设为默认文本应用
    linux应用管理
    当你在工作中失去动力时该怎么办?
  • 原文地址:https://www.cnblogs.com/babydragon/p/11461909.html
Copyright © 2011-2022 走看看