蒟蒻90求助!!(孩子哭了)
查看原帖
蒟蒻90求助!!(孩子哭了)
240210
Kuchiki_Touko楼主2021/9/27 11:55
#include <bits/stdc++.h>
#define ll long long
#define maxn 100011
using namespace std;

int n,m;
int mp[551][551],cnt;
int ans,tot;
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
bool book[5111],op[551][551];
queue<pair<int,int> > q;

inline ll read() {
    ll res,op = 1;
    char ch;
    while((ch=getchar())<'0' || ch > '9') if(ch == '-') op = -1;
    res = (ll)(ch - '0');
    while((ch = getchar())<='9' && ch >= '0')
        res = (res<<1) + (res<<3) + (ll)(ch - '0');
    return res * op;
}
struct node{
    int l,r;
}a[1011];
bool cmp(node a,node b) {
    if(a.l == b.l)
        return a.r > b.r;
    return a.l < b.l;
}
int main()
{
    memset(book,false,sizeof(book));
    n = read(),m = read();
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m;j++)
            mp[i][j] = read();
    
    for(int i = 1;i <= m;i++)
    {
        memset(op,false,sizeof(op));
        q.push(make_pair(1,i));
        int lr = 511,rr = 0;
        // printf("%d %d\n",1,i);
        while(!q.empty())
        {
            int tx = q.front().first,ty = q.front().second;
            q.pop();
            int rx,ry;
            for(int i = 0;i < 4;i++)
            {
                rx = tx + dir[i][0];
                ry = ty + dir[i][1];
                if(!op[rx][ry] && rx <= n && rx >= 1 && ry <= m && ry >= 1 && mp[tx][ty] > mp[rx][ry])
                {
                    op[rx][ry] = true;
                    // printf("%d %d    ",rx,ry);
                    q.push(make_pair(rx,ry));

                    if(rx == n) lr = min(lr,ry),rr = max(rr,ry),book[ry] = true;
                }
            }
        }
        // printf("\n");
        if(lr != 511)
            a[++cnt].l = lr,a[cnt].r = rr;
        if(a[cnt].l == 1 && a[cnt].r == m) break;
    }
    if(n == 1)
        for(int i = 1;i <= m;i++)
            a[++cnt].l = a[cnt].r = i;
    
    for(int i = 1;i <= m;i++)
        if(book[i])
            tot++;

    if(tot != m && n != 1) {
        printf("0\n%d\n",m-tot);
        return 0;
    }
    else {
        int fr = a[1].r,fl = a[1].r;
        
        ans = 1;
        sort(a+1,a+1+cnt,cmp);
        int j = 2,i = 2;
        while(1) {
            if(fl >= m)
                break;
            j = i;
            while(a[j].l <= fl+1)
                j++;
            for(int k = i;k < j;k++)
                fl = max(fl,a[k].r);
            ans++;
            i = j;
            if(i > cnt)
                break;
        }
        /*
        for(int i = 2;i <= m;i++) {
            if(a[i].l > fl+1)
                fl = fr,ans++,printf("%d\n",fl);
            if(a[i].l <= fl+1)
                fr = max(fr,a[i].r);
            if(fl == m)
                break;
        }
        */
        printf("1\n%d\n",ans);
    }
    
    

    return 0;
}

第七个点TLE了

2021/9/27 11:55
加载中...