• 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.

  • 相关阅读:
    asp.net 验证正则表达式
    c语言编程题
    使用Code First创建数据模型
    c语言知识点
    rabbitmq 简单应用
    influxdb(二)
    influxdb(一)
    K8S 日志收集(六):kibana 安装
    K8S 日志收集(五):head插件安装
    K8S 日志收集(四):logstash 安装
  • 原文地址:https://www.cnblogs.com/babydragon/p/11461909.html
Copyright © 2020-2023  润新知