zoukankan      html  css  js  c++  java
  • [NOIP2010]引水入城

    [NOIP2010]引水入城

    去年看了好久woc不会
    今年看了很久nm还是不会
    说正事
    发现如果所有干旱区都能被覆盖的话,那么每个蓄水厂的贡献一定是一个区间(可以反证),
    于是(O(n^3))dfs找出每个蓄水厂的区间,贪心做区间覆盖即可.
    注意如果不是所有干旱区都能被覆盖的话,那么就不一定是区间

    #include<bits/stdc++.h>
    using namespace std;
    const int _=505;
    int re(){
        int x=0,w=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    int n,m,now,ans;
    int h[_][_];
    bool vis[_][_],ok[_];
    struct seg{int l,r;}s[_];
    bool cmp(seg a,seg b){return a.l<b.l||(a.l==b.l&&a.r<b.r);}
    void dfs(int x,int y){
        if(vis[x][y])return;vis[x][y]=1;
        if(x==n){
            ok[y]=1;
            s[now].l=min(s[now].l,y);
            s[now].r=max(s[now].r,y);
        }
        if(x>1&&h[x-1][y]<h[x][y])dfs(x-1,y);
        if(x<n&&h[x+1][y]<h[x][y])dfs(x+1,y);
        if(y>1&&h[x][y-1]<h[x][y])dfs(x,y-1);
        if(y<m&&h[x][y+1]<h[x][y])dfs(x,y+1);
    }
    int main(){
        n=re(),m=re();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                h[i][j]=re();
        for(int i=1;i<=m;i++){
            s[i].l=_;
            memset(vis,0,sizeof(vis));
            now=i;dfs(1,i);
        }
        for(int i=1;i<=m;i++)
            if(!ok[i])ans++;
        if(ans){printf("0
    %d
    ",ans);return 0;}
        sort(s+1,s+m+1,cmp);
        int r=0,i=1;
        while(r<m){
            int mr=r;
            while(i<=m&&s[i].l<=r+1)mr=max(mr,s[i++].r);
            r=mr;++ans;
        }
        printf("1
    %d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    线性表单链表的实现
    线性表顺序存储结构
    【C语言】产生随机数
    TCP/IP协议
    【bfs】奇怪的电梯(P1135)
    【DFS】取数游戏(P1123)
    【DFS】圣诞夜的极光(P1454)
    【贪心】骑士的工作(P2695)
    【贪心】纪念品分组(P1094)
    生活的那么一点反思
  • 原文地址:https://www.cnblogs.com/sdzwyq/p/9927427.html
Copyright © 2011-2022 走看看