MnZn求助

P2403 [SDOI2010] 所驼门王的宝藏

```cpp #include<cstdio> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<set> using namespace std; const int N=1e5+10; const int M=1e6+100; struct EDGE{ int v,nxt; }ed[M<<1],edge[M<<1]; int n,r,c,x[N],y[N],z[N],hd[N],e0,e,head[N]; void ade(int u,int v){ ed[++e0].v=v; ed[e0].nxt=hd[u]; hd[u]=e0; } void adde(int u,int v){ edge[++e].v=v; edge[e].nxt=head[u]; head[u]=e; } int dfn[N],low[N],cnt,cnt2,col[N],val[N]; bool ins[N]; stack<int> st; void Tarjan(int x){ dfn[x]=low[x]=++cnt; st.push(x); ins[x]=1; for(int i=hd[x];i;i=ed[i].nxt){ int v=ed[i].v; if(!dfn[v]) Tarjan(v),low[x]=min(low[x],low[v]); else if(ins[v]) low[x]=min(low[x],dfn[v]); } if(low[x]==dfn[x]){ ++cnt2; int tp=st.top(); while(tp!=x){ st.pop(); col[tp]=cnt2; ++val[cnt2]; ins[tp]=0; tp=st.top(); } st.pop(); col[tp]=cnt2; ++val[cnt2]; ins[tp]=0; } } int in[N],f[N]; queue<int> q; int topodp(){ for(int i=1;i<=cnt2;i++) if(!in[i]) q.push(i),f[i]=val[i]; while(!q.empty()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=edge[i].nxt){ int v=edge[i].v; f[v]=max(f[v],f[x]+val[v]); if(!(--in[v])) q.push(v); } } int ans=0; for(int i=1;i<=cnt2;i++) ans=max(ans,f[i]); return ans; } typedef long long ll; struct NODE{ ll site; int idx; NODE(){} NODE(ll _site,int _idx) : site(_site) , idx(_idx) {} bool operator <(const NODE rhs) const { return site<rhs.site; } }; vector<int> row[N],line[N]; set<NODE> s; const ll p=1e6; const int dx[8]={-1,-1,-1,0,0,1,1,1}; const int dy[8]={-1,0,1,-1,1,-1,0,1}; inline ll calc(int x,int y){ return 1ll*x+p*y; } int main(){ // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); scanf("%d%d%d",&n,&r,&c); for(int i=1;i<=n;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]),row[x[i]].push_back(i), line[y[i]].push_back(i),s.insert(NODE(calc(x[i],y[i]),i)); for(int i=1;i<=n;i++) switch(z[i]){ case 1:{ for(int j=0;j<row[x[i]].size();j++) if(row[x[i]][j]!=i) ade(i,row[x[i]][j]); break; } case 2:{ for(int j=0;j<line[y[i]].size();j++) if(line[y[i]][j]!=i) ade(i,line[y[i]][j]); break; } case 3:{ for(int j=0;j<8;j++){ auto it=s.find(NODE(calc(x[i]+dx[j],y[i]+dy[j]),0)); if(it!=s.end()) ade(i,it->idx); } break; } } for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); // for(int i=1;i<=n;i++) // printf("%d %d\n",dfn[i],col[i]); // for(int i=1;i<=cnt2;i++) // printf("%d\n",val[i]); for(int x=1;x<=n;x++) for(int i=hd[x];i;i=ed[i].nxt){ int v=ed[i].v; if(col[x]!=col[v]) adde(col[x],col[v]),++in[col[v]]; } printf("%d\n",topodp()); return 0; } ```
by Focus_on @ 2022-10-27 20:25:09


我第九个点Wa,开O2后AC。。。 不是很理解
by I_Flipped @ 2022-11-09 12:16:29


|