RE 10pts
查看原帖
RE 10pts
916579
GoodLuckCat楼主2024/5/11 13:08

rt.#9 AC 其余 RE。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int V=N<<1;
const int E=1e6+5;
const int dx[8]={0,0,1,1,1,-1,-1,-1};
const int dy[8]={1,-1,-1,0,1,-1,0,1};
struct edge
{
    int nxt,to;
}e[E],ne[E];
int fir[V],nfir[V],cnt=0,ncnt=0;
int row[N],col[N],totr=0,totc=0;
int n,r,c,x[N],y[N],opt[N];
map<pair<int,int>,int>Point;
int dfn[V],clo=0;
int bcc_cnt=0,trea[V];
int sta[V],bel[V],top,ind[V],dist[V];
queue<int>Q;
bool inq[V];
void add(int x,int y)
{
    e[++cnt].to=y;
    e[cnt].nxt=fir[x];
    fir[x]=cnt;
}
void nadd(int x,int y)
{
    ne[++ncnt].to=y;
    ne[ncnt].nxt=nfir[x];
    nfir[x]=ncnt;
}
int dfs(int u)
{
    dfn[u]=++clo;
    int lowu=dfn[u],lowv,v;
    sta[++top]=u;
    for(int i=fir[u];i;i=e[i].nxt)
    {
        v=e[i].to;
        if(!dfn[v])
        {
            lowv=dfs(v);
            lowu=min(lowu,lowv);
        }
        else if(!bel[v])lowu=min(lowu,dfn[v]);
    }
    if(lowu==dfn[u])
    {
        int cur=0;
        bcc_cnt++;
        while(cur!=u)
        {
            cur=sta[top--];
            bel[cur]=bcc_cnt;
            if(cur<=n)trea[bcc_cnt]++;
        }
    }
    return lowu;
}
int main()
{
    cin>>n>>r>>c;
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i]>>opt[i];
        if(opt[i]==1)row[++totr]=x[i];
        if(opt[i]==2)col[++totc]=y[i];
        Point[make_pair(x[i],y[i])]=i;
    }
    sort(row+1,row+totr+1);
    totr=unique(row+1,row+totr+1)-row-1;
    sort(col+1,col+totc+1);
    totc=unique(col+1,col+totc+1)-col-1;
    int p,nx,ny;
    for(int i=1;i<=n;i++)
    {
        p=lower_bound(row+1,row+totr+1,x[i])-row;
        if(row[p]==x[i])
        {
            add(n+p,i);
            if(opt[i]==1)add(i,n+p);
        }
        p=lower_bound(col+1,col+totc+1,y[i])-col;
        if(col[p]==y[i])
        {
            add(n+totr+p,i);
            if(opt[i]==2)add(i,n+totr+p);
        }
        if(opt[i]==3)
            for(int j=0;j<9;j++)
            {
                nx=x[i]+dx[j];
                ny=y[i]+dy[j];
                if(!Point.count(make_pair(nx,ny)))continue;
                p=Point[make_pair(nx,ny)];
                add(i,p);
            }
    }
    for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
    for(int i=1;i<=n+totc+totr;i++)
        for(int j=fir[i];j;j=e[j].nxt)
        {
            int u=e[j].to;
            if(bel[i]!=bel[u])nadd(bel[i],bel[u]),ind[bel[u]]++;
        }
    for(int i=1;i<=bcc_cnt;i++)
    {
        if(ind[i]==0)Q.push(i),inq[i]=1,dist[i]=trea[i];
        int u,v;
        while(!Q.empty())
        {
            u=Q.front();
            inq[u]=0;
            Q.pop();
            for(int i=nfir[u];i;i=ne[i].nxt)
            {
                v=ne[i].to;
                if(dist[v]<dist[u]+trea[v])
                {
                    dist[v]=dist[u]+trea[v];
                    if(!inq[v])
                    {
                        inq[v]=1;
                        Q.push(v);
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=bcc_cnt;i++)ans=max(ans,dist[i]);
    cout<<ans;
    return 0;
}
2024/5/11 13:08
加载中...