萌新求助,只有40分,求一个不排序建边的建边方法

P2403 [SDOI2010] 所驼门王的宝藏

@[songhaoran](/space/show?uid=80679) 我好像就没有排序
by ecnerwaIa @ 2019-03-14 20:23:34


@[songhaoran](/space/show?uid=80679) ```cpp #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #include <queue> #include <map> using namespace std; map<int,int>lx,ly; int cnt,py[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}}; const int N=410000,M=110000; struct node{ int opt,x,y; }t[M]; int n,r,c,to[N],nxt[N],d[N]; int tot; inline void ins(int a,int b){ to[++tot]=b; nxt[tot]=d[a]; d[a]=tot; } int dfn[N],st[N],id[N],size[N],dfstime,low[N],cl; bool instack[N]; inline void tarjan(int x){ dfn[x]=low[x]=++dfstime; st[++st[0]]=x; instack[x]=1; for(int i=d[x];i;i=nxt[i]){ int u=to[i]; if(instack[u]){ low[x]=min(low[x],dfn[u]); } else{ if(!dfn[u]){ tarjan(u); low[x]=min(low[x],low[u]); } } } if(dfn[x]==low[x]){ ++cl; int k; do{ k=st[st[0]--]; id[k]=cl; instack[k]=0; if(k<=n)size[cl]++; }while(k!=x); } } int to_2[N],nxt_2[N],d_2[N],tot_2,rd[N],dp[N],ans; inline void ins_2(int a,int b){ to_2[++tot_2]=b; nxt_2[tot_2]=d_2[a]; d_2[a]=tot_2; } struct wjr{ int head[50100],val[100100],id[100100],nt[100100],cnt; }g[2]; const int hash=50000; inline int gets(int val,int now){ int p=(val%hash)+1; for(int i=g[now].head[p];i;i=g[now].nt[i]){ if(val==g[now].val[i]){ return g[now].id[i]; } } g[now].nt[++g[now].cnt]=g[now].head[p]; int num=g[now].cnt; g[now].head[p]=num; g[now].val[num]=val; g[now].id[num]=++cnt; return cnt; } struct wjr_2{ int head[50010],nt[100100],cnt,id[100100]; long long val[100100]; }w; inline void ins_hash(long long v,int num){ int p=v%hash+1; w.nt[++w.cnt]=w.head[p]; w.head[p]=w.cnt; w.val[w.cnt]=v; w.id[w.cnt]=num; } inline int get_hash(long long v){ int p=v%hash+1; for(int i=w.head[p];i;i=w.nt[i]){ if(v==w.val[i]){ return w.id[i]; } } return 0; } int main(){ scanf("%d%d%d",&n,&r,&c); cnt=n; for(int i=1;i<=n;++i){ scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].opt); int rx=gets(t[i].x,0),ry=gets(t[i].y,1); ins(rx,i); ins(ry,i); if(t[i].opt==1){ ins(i,rx); } if(t[i].opt==2){ ins(i,ry); } ins_hash((t[i].x-1ll)*1ll*c+(t[i].y),i); } for(int i=1;i<=n;++i){ if(t[i].opt!=3)continue; for(int j=0;j<8;++j){ int nx=t[i].x+py[j][0],ny=t[i].y+py[j][1]; int g=get_hash((nx-1ll)*1ll*c+ny); if(g)ins(i,g); } } for(int i=1;i<=cnt;++i)if(!dfn[i])tarjan(i); for(int i=1;i<=cnt;++i){ for(int j=d[i];j;j=nxt[j]){ int u=to[j]; if(id[u]!=id[i]){ ins_2(id[i],id[u]); rd[id[u]]++; } } } int l=1,r=0; for(int i=1;i<=cl;++i){ if(!rd[i])st[++r]=i; dp[i]=size[i]; } while(r>=l){ int x=st[l++]; ans=max(ans,dp[x]); for(int i=d_2[x];i;i=nxt_2[i]){ int u=to_2[i]; rd[u]--; dp[u]=max(dp[u],dp[x]+size[u]); if(!rd[u])st[++r]=u; } } printf("%d\n",ans); return 0; } ```
by ecnerwaIa @ 2019-03-14 20:24:45


```cpp #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #include <queue> #include <map> using namespace std; map<int,int>lx,ly; int cnt,py[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}}; const int N=410000,M=110000; struct node{ int opt,x,y; }t[M]; int n,r,c,to[N],nxt[N],d[N]; int tot; inline void ins(int a,int b){ to[++tot]=b; nxt[tot]=d[a]; d[a]=tot; } int dfn[N],st[N],id[N],size[N],dfstime,low[N],cl; bool instack[N]; inline void tarjan(int x){ dfn[x]=low[x]=++dfstime; st[++st[0]]=x; instack[x]=1; for(int i=d[x];i;i=nxt[i]){ int u=to[i]; if(instack[u]){ low[x]=min(low[x],dfn[u]); } else{ if(!dfn[u]){ tarjan(u); low[x]=min(low[x],low[u]); } } } if(dfn[x]==low[x]){ ++cl; int k; do{ k=st[st[0]--]; id[k]=cl; instack[k]=0; if(k<=n)size[cl]++; }while(k!=x); } } int to_2[N],nxt_2[N],d_2[N],tot_2,rd[N],dp[N],ans; inline void ins_2(int a,int b){ to_2[++tot_2]=b; nxt_2[tot_2]=d_2[a]; d_2[a]=tot_2; } struct wjr{ int head[50100],val[100100],id[100100],nt[100100],cnt; }g[2]; const int hash=50000; inline int gets(int val,int now){ int p=(val%hash)+1; for(int i=g[now].head[p];i;i=g[now].nt[i]){ if(val==g[now].val[i]){ return g[now].id[i]; } } g[now].nt[++g[now].cnt]=g[now].head[p]; int num=g[now].cnt; g[now].head[p]=num; g[now].val[num]=val; g[now].id[num]=++cnt; return cnt; } struct wjr_2{ int head[50010],nt[100100],cnt,id[100100]; long long val[100100]; }w; inline void ins_hash(long long v,int num){ int p=v%hash+1; w.nt[++w.cnt]=w.head[p]; w.head[p]=w.cnt; w.val[w.cnt]=v; w.id[w.cnt]=num; } inline int get_hash(long long v){ int p=v%hash+1; for(int i=w.head[p];i;i=w.nt[i]){ if(v==w.val[i]){ return w.id[i]; } } return 0; } int main(){ scanf("%d%d%d",&n,&r,&c); cnt=n; for(int i=1;i<=n;++i){ scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].opt); int rx=gets(t[i].x,0),ry=gets(t[i].y,1); ins(rx,i); ins(ry,i); if(t[i].opt==1){ ins(i,rx); } if(t[i].opt==2){ ins(i,ry); } ins_hash((t[i].x-1ll)*1ll*c+(t[i].y),i); } for(int i=1;i<=n;++i){ if(t[i].opt!=3)continue; for(int j=0;j<8;++j){ int nx=t[i].x+py[j][0],ny=t[i].y+py[j][1]; int g=get_hash((nx-1ll)*1ll*c+ny); if(g)ins(i,g); } } for(int i=1;i<=cnt;++i)if(!dfn[i])tarjan(i); for(int i=1;i<=cnt;++i){ for(int j=d[i];j;j=nxt[j]){ int u=to[j]; if(id[u]!=id[i]){ ins_2(id[i],id[u]); rd[id[u]]++; } } } int l=1,r=0; for(int i=1;i<=cl;++i){ if(!rd[i])st[++r]=i; dp[i]=size[i]; } while(r>=l){ int x=st[l++]; ans=max(ans,dp[x]); for(int i=d_2[x];i;i=nxt_2[i]){ int u=to_2[i]; rd[u]--; dp[u]=max(dp[u],dp[x]+size[u]); if(!rd[u])st[++r]=u; } } printf("%d\n",ans); return 0; } ```
by ecnerwaIa @ 2019-03-14 20:24:57


~~去你的萌新~~
by Limit @ 2019-03-14 20:25:09


这题貌似是并查集,反正我不会
by Limit @ 2019-03-14 20:25:31


@[Sxy_Limit](/space/show?uid=86625) 这题不是拓扑排序+tarjan吗?
by ecnerwaIa @ 2019-03-14 20:26:24


我弱呀,记得老师说是并查集
by Limit @ 2019-03-14 20:27:53


这题改了数据吗?为什么我交以前的AC代码RE了...
by ecnerwaIa @ 2019-03-14 20:29:26


@[Sxy_Limit](/space/show?uid=86625) 并查集?
by ecnerwaIa @ 2019-03-14 20:30:22


@[千年之狐_天才](/space/show?uid=54113) ~~我记得貌似是这样的QAQ~~ 您能AC说明您强,我不会说明我弱
by Limit @ 2019-03-14 20:33:02


| 下一页