建立虚点5个MLE:
#include<bits/stdc++.h>
using namespace std;
const int N=8e5+10;
int n,r,c;
int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,-1,-1,-1,0,1,1,1};
int w[N],dp[N];
struct node
{
int from,to,nxt;
}g[N<<1];int h[N],len=0;
void add(int from,int to){
g[len]={from,to,h[from]};
h[from]=len;len++;
}
typedef pair<int,int> PII;
map<PII,int> point;
int cnt=0;
bool inmap(int x,int y)
{
if(x>=1&&x<=r&&y>=1&&y<=c) return true;
else return false;
}
void getnode(int x,int y)
{
if(!point.count(PII(x,y))) {
point[PII(x,y)]=++cnt;
int rt=point[PII(x,0)];
int ct=point[PII(0,y)];
add(rt,point[PII(x,y)]);add(ct,point[PII(x,y)]);
}
return ;
}
struct door
{
int x,y,t;
}d[N];
int dfn[N],low[N],idx=0,st[N],top=0,co[N],col=0,s[N];
void tarjan(int u){
low[u]=dfn[u]=++idx;
st[++top]=u;
for(int i=h[u];~i;i=g[i].nxt){
int v=g[i].to;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!co[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
co[u]=++col;
s[col]=w[u];
while(st[top]!=u)
{
co[st[top]]=col;
s[col]+=w[st[top]];
top--;
}
top--;
}
}
int main(){
memset(h,-1,sizeof h);
scanf("%d%d%d",&n,&r,&c);
for(int i=1;i<=r;i++) point[PII(i,0)]=++cnt;
for(int i=1;i<=c;i++) point[PII(0,i)]=++cnt;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].t);
getnode(d[i].x,d[i].y);w[point[PII(d[i].x,d[i].y)]]=1;
int u=point[PII(d[i].x,d[i].y)],rv=point[PII(d[i].x,0)],cv=point[PII(0,d[i].y)];
if(d[i].t==1) add(u,rv);
else if(d[i].t==2) add(u,cv);
else {
for(int j=0;j<8;j++)
{
int dxx=dx[j]+d[i].x,dyy=dy[j]+d[i].y;
if(inmap(dxx,dyy))
{
getnode(dxx,dyy);
int t=point[PII(dxx,dyy)];
add(u,t);
}
}
}
}
for(int i=1;i<=cnt;i++)
if(!dfn[i]) tarjan(i);
int t=len;len=0;
memset(h,-1,sizeof h);
for(int i=1;i<=t;i++){
int u=co[g[i].from],v=co[g[i].to];
if(u!=v) add(u,v);
}
for(int i=1;i<=col;i++){
for(int j=h[i];~j;j=g[j].nxt){
int v=g[j].to;
dp[i]=max(dp[i],dp[v]+s[i]);
}
}
int ans=0;
for(int i=1;i<=col;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}