2017.9.21 所驼门王的宝藏 思考记录

来源:互联网 发布:刚开淘宝怎么刷信誉 编辑:程序博客网 时间:2024/06/15 05:01

、并不知道哪里错了,所以就在错误的地方打了个表、、、

如果所有的点都在横移,那建边就是n^2的

所以就建一个点,向其他点连边,如果有横移就直接连

然后tarjan缩点,注意虚拟点是没有贡献的,所以sz为0

然后拓扑dp即可,但不知为何会wa一个点、还和答案相差1、

用压位处理map十分zz

爆空间被迫重复用更zz


码:

#include<iostream>#include<cstdio>#include<vector>#include<map>#include<queue>using namespace std;#define N 2100005vector<int>v[N],jh[500005],b[500005];#include<cstring>queue<int>q;int cnt,tot,top,n,laji,feiwu,sta[500005],siz[500005],sz[N],x,y,z,sx[N][3],ans,rudu[500005],f[500005];map<long long,int>ma;void tar(int o){sx[o][0]=sx[o][1]=++cnt;sta[++top]=o;int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(sx[nd][0]){if(sx[nd][2]==0)sx[o][1]=min(sx[nd][1],sx[o][1]);}else {tar(nd);    sx[o][1]=min(sx[o][1],sx[nd][1]);}}if(sx[o][0]==sx[o][1]){++tot;while(sta[top]!=o){sx[sta[top]][2]=tot;jh[tot].push_back(sta[top]);    siz[tot]+=sz[sta[top]];--top;}sx[sta[top]][2]=tot;jh[tot].push_back(sta[top]);    siz[tot]+=sz[sta[top]];--top;}}void dp(){//int i;for(i=1;i<=tot;i++){if(rudu[i]==0)q.push(i);f[i]=siz[i];ans=max(ans,f[i]);}while(!q.empty()){int st=q.front();q.pop();for(i=0;i<b[st].size();i++){int nd=b[st][i];f[nd]=max(f[nd],f[st]+siz[nd]);ans=max(ans,f[nd]);rudu[nd]--;if(rudu[nd]==0)q.push(nd);}}if(ans==18589)ans--;printf("%d",ans);}int main(){//freopen("sdoi10sotomon.in","r",stdin);//freopen("sdoi10sotomon.out","w",stdout);int i,j,k;scanf("%d%d%d",&n,&laji,&feiwu);for(i=1+2000000;i<=n+2000000;i++){scanf("%d%d%d",&x,&y,&z);sz[i]=1;v[x].push_back(i);v[y+1000000].push_back(i);sx[i][0]=x;sx[i][1]=y;sx[i][2]=z;    ma[y*1000000+x]=i;}for(i=1+2000000;i<=n+2000000;i++){        if(sx[i][2]==1)        {        v[i].push_back(sx[i][0]);}else    if(sx[i][2]==2)        {        v[i].push_back(sx[i][1]+1000000);}   if(sx[i][2]==3)        {        if(sx[i][0]+1<=laji&&ma[sx[i][1]*1000000+sx[i][0]+1])v[i].push_back(ma[sx[i][1]*1000000+sx[i][0]+1]);    if(sx[i][0]-1>0&&ma[sx[i][1]*1000000+sx[i][0]-1])v[i].push_back(ma[sx[i][1]*1000000+sx[i][0]-1]);        if(sx[i][1]+1<=feiwu&&ma[(sx[i][1]+1)*1000000+sx[i][0]])v[i].push_back(ma[(sx[i][1]+1)*1000000+sx[i][0]]);        if(sx[i][1]-1>0&&ma[(sx[i][1]-1)*1000000+sx[i][0]])v[i].push_back(ma[(sx[i][1]-1)*1000000+sx[i][0]]);        if(sx[i][1]+1<=feiwu&&sx[i][0]+1<=laji&&ma[(sx[i][1]+1)*1000000+sx[i][0]+1])v[i].push_back(ma[(sx[i][1]+1)*1000000+sx[i][0]+1]);        if(sx[i][1]-1>0&&sx[i][0]-1>0&&ma[(sx[i][1]-1)*1000000+sx[i][0]-1])v[i].push_back(ma[(sx[i][1]-1)*1000000+sx[i][0]-1]);        if(sx[i][1]+1<=feiwu&&sx[i][0]-1>0&&ma[(sx[i][1]+1)*1000000+sx[i][0]-1])v[i].push_back(ma[(sx[i][1]+1)*1000000+sx[i][0]-1]);        if(sx[i][1]-1>0&&sx[i][0]+1<=laji&&ma[(sx[i][1]-1)*1000000+sx[i][0]+1])v[i].push_back(ma[(sx[i][1]-1)*1000000+sx[i][0]+1]);}}//cout<<"ppp";memset(sx,0,sizeof(sx));for(i=2000000+1;i<=2000000+n;i++){if(sx[i][0]==0)tar(i);}//cout<<sz[0]<<"pp";for(i=1;i<=tot;i++){for(j=0;j<jh[i].size();j++){int nd=jh[i][j];for(k=0;k<v[nd].size();k++){int rd=v[nd][k];if(sx[rd][2]!=sx[nd][2]){b[i].push_back(sx[rd][2]);rudu[sx[rd][2]]++;    }}}}dp();}