萌新刚学OI 疯狂TLE QWQ

P1983 [NOIP2013 普及组] 车站分级

七里 @ 2019-10-21 09:08:04

我太弱了TAT

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define R register
using namespace std;
int n,m,ans,d[1010],a[1010][1010];
bool v[1010][1010],vis[1010],stop[1010];
int tot,head[1010],ver[10010000],nex[10010000],du[1010];
inline void read(int &x){
    x=0;int flag=1;char c;
    c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') flag=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    x*=flag;
}
inline void add(int x,int y){
    du[y]++;v[x][y]=1;
    ver[++tot]=y;nex[tot]=head[x];head[x]=tot;
}
inline void cmax(int &x,int y){
    if(x<y) x=y;
}
inline void cmin(int &x,int y){
    if(x>y) x=y;
}
queue<int> q;
int main (){
    read(n),read(m);
    for(R int to,mi,mx,i=1;i<=m;i++){
        read(to);
        mi=1e9;mx=-1e9;
        for(R int x,j=1;j<=to;j++){
            read(x);
            a[i][x]=1;
            cmin(mi,x);
            cmax(mx,x);
        }
        for(R int j=mi;j<=mx;j++){
            if(a[i][j]) continue;
            for(R int k=mi;k<=mx;k++){
                if(a[i][k]&&!v[j][k]) add(j,k);
            }
        }
    }
    for(R int i=1;i<=n;i++){
        if(du[i]==0) q.push(i),d[i]=1;
    }
    while(q.size()){
        int x=q.front();q.pop();vis[x]=1;
        for(R int i=head[x];i;i=nex[i]){
            cmax(d[ver[i]],d[x]+1);cmax(ans,d[ver[i]]);
            du[ver[i]]--;
            if(du[ver[i]]==0&&!vis[ver[i]]) q.push(ver[i]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

|