hydro 评测姬与洛谷评测姬的鲜明对比
查看原帖
hydro 评测姬与洛谷评测姬的鲜明对比
476985
Accelessar楼主2023/4/11 19:48

可能略微标题党(?

但是这是事实。同一份代码,在 hydro 的 bzoj 域里可以轻松 AC,峰值内存仅为 71.1MB,而在洛谷却全部 MLE。怎么会是呢?

hydro AC 记录

洛谷 MLE 记录

代码如下:

#include<bits/extc++.h>
using namespace std;
typedef pair<int,int> pii;
#define fr(i,l,r) for(int i=(l);i<=(r);i++)
#define eb emplace_back
#define ep emplace
template<typename T>inline T rd(T&a){
    #define gc getchar
    #define dg(x) (x>='0'&&x<='9')
    char c=gc();T x=0,f=1;
    for(;!dg(c);c=gc())if(c=='-')f=-1;
    for(;dg(c);c=gc())x=(x<<1)+(x<<3)+c-48;
    return a=f*x;
}template<typename T,typename...Val>void rd(T&x,Val&...val){rd(x),rd(val...);}
const int inf=0x3f3f3f3f,N=1e7+10;
const int dx[9]={-1,-1,-1,0,1,1,1,0},dy[9]={-1,0,1,1,1,0,-1,-1};
int n,R,C,x,y,t,low[N],num,dfn[N],stk[N],top,c[N],cnt,sz[N],dis[N],f[N],in[N],ans=-inf;
bool ins[N];
map<pii,int>id;
vector<int>gra[N],e[N];
vector<pii>ver;

void tarjan(int u){
    low[u]=dfn[u]=++num,stk[++top]=u,ins[u]=1;
    for(int v:gra[u])
        if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
        else if(ins[v])low[u]=min(low[u],dfn[v]);
    if(low[u]==dfn[u]){++cnt;for(int v=0;u^v;)ins[v=stk[top--]]=0,c[v]=cnt,sz[cnt]+=dis[v];}
}

void topo(){
    queue<int>q;
    fr(i,1,cnt)if(f[i]=sz[i];!in[i])q.ep(i);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int v:e[u])if(f[v]=max(f[v],f[u]+sz[v]);!--in[v])q.ep(v);
    }
}

int main(){
    rd(n,R,C);
    fr(i,1,n){
        int u=R+C+i;
        rd(x,y,t),dis[u]=1,id[{x,y}]=i;
        gra[x].eb(u),gra[R+y].eb(u);
        switch(t){
            case 1: gra[u].eb(x);break;
            case 2: gra[u].eb(R+y);break;
            case 3: ver.eb(x,y);
        }
    }
    for(auto[x,y]:ver)fr(i,0,7){
        int xx=x+dx[i],yy=y+dy[i];
        auto it=id.find({xx,yy});
        if(it!=id.end()){
            auto[fi,se]=*it;
            gra[R+C+id[{x,y}]].eb(R+C+se);
        }
    }
    fr(i,1,R+C+n)if(!dfn[i])tarjan(i);
    fr(u,1,R+C+n)for(int v:gra[u])if(c[u]^c[v])e[c[u]].eb(c[v]),in[c[v]]++;
    topo();fr(i,1,cnt)ans=max(ans,f[i]);
    return cout<<ans,0;
}

求调。

2023/4/11 19:48
加载中...