luogu已A的代码为何在校内OJ上面T3个点???别人都A了

P2272 [ZJOI2007] 最大半连通子图

smarthehe @ 2019-01-16 20:47:40

RT

luogu非O2评测记录

luoguO2评测记录

下面是代码,求大佬看看能否改进QwQ

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1e5+5,M=1e6+5;
int a,MOD,dfn[N],low[N],st[N],col[N],dep,num,top,siz[N],dp[N],fr[M],to[M],pos[M],deg[N],dis[N],ans;
int q[N],h,t,alans;
vector<int> g[N],ng[N];
void tarjan(int now)
{
    int i;
    dfn[now]=++dep;
    low[now]=dep;
    st[++top]=now;
    for(i=0;i<g[now].size();i++)
    {
        int tmp=g[now][i];
        if(!dfn[tmp])
        {
            tarjan(tmp);
            low[now]=min(low[now],low[tmp]);
        }
        else if(!col[tmp]) low[now]=min(low[now],low[tmp]);
    }
    if(dfn[now]==low[now])
    {
        col[now]=++num;
        siz[num]++;
        while(st[top]!=now)
        {
            col[st[top--]]=num;
            siz[num]++;
        }
        top--;
    }
}
bool cmp(int x,int y)
{
    if(fr[x]!=fr[y]) return fr[x]<fr[y];
    return to[x]<to[y];
}
int main()
{
    int b,c,d,i,j;
    scanf("%d%d%d",&a,&b,&MOD);
    for(i=0;i<b;i++)
    {
        scanf("%d%d",&c,&d);
        fr[i]=c,to[i]=d;
        g[c].push_back(d);
    }
    //tarjan
    for(i=1;i<=a;i++)
    {
        if(!dfn[i]) tarjan(i);
    }
    //去缩点后重边
    for(i=0;i<b;i++)
    {
        pos[i]=i;
        fr[i]=col[fr[i]];
        to[i]=col[to[i]];
    }
    sort(pos,pos+b,cmp);
    //统计入度
    for(i=0;i<b;i++)
    {
        if(fr[pos[i]]==to[pos[i]]||(fr[pos[i]]==fr[pos[i-1]]&&to[pos[i]]==to[pos[i-1]])) continue;
        ng[fr[pos[i]]].push_back(to[pos[i]]);
        deg[to[pos[i]]]++;
    }
    //拓扑排序初始化 
    for(i=1;i<=num;i++)
    {
        if(!deg[i])
        {
            q[t++]=i;
            dis[i]=siz[i];
            dp[i]=1;
            if(dis[ans]<dis[i]) ans=i;
        }
    }
    //拓扑 
    while(h<t)
    {
        int tmp=q[h++];
        for(i=0;i<ng[tmp].size();i++)
        {
            int taim=ng[tmp][i];
            if(!--deg[taim]) q[t++]=taim;
            if(dis[taim]<dis[tmp]+siz[taim])
            {
                dis[taim]=dis[tmp]+siz[taim];
                dp[taim]=0;
                if(dis[ans]<dis[taim]) ans=taim;
            }
            if(dis[taim]==dis[tmp]+siz[taim]) dp[taim]=(dp[tmp]+dp[taim])%MOD;
        }
    }
    for(i=1;i<=num;i++) if(dis[i]==dis[ans]) alans=(alans+dp[i])%MOD;
    printf("%d\n%d",dis[ans],alans);
    return 0;
}

by smarthehe @ 2019-01-16 20:49:53

难道是vector背锅???qaq


by 引领天下 @ 2019-01-16 20:53:40

@smarthehe 校内OJ是啥啊QAQ


by smarthehe @ 2019-01-16 21:06:53

@引领天下

就是我们学校搭建(抄)的私下的OJ


by Hydra_Shouko @ 2019-03-21 18:04:40

有可能真是vector啊 (反正我不这么写 逃


|