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();}
阅读全文
0 0
- 2017.9.21 所驼门王的宝藏 思考记录
- bzoj1924 所驼门王的宝藏
- 【SDOI2010】【BZOJ1924】所驼门王的宝藏
- BZOJ 1924所驼门王的宝藏
- 1924: [Sdoi2010]所驼门王的宝藏
- BZOJ1924: [Sdoi2010]所驼门王的宝藏
- BZOJ1924: [Sdoi2010]所驼门王的宝藏
- bzoj1924 [Sdoi2010]所驼门王的宝藏
- bzoj1924: [Sdoi2010]所驼门王的宝藏
- 1924: [Sdoi2010]所驼门王的宝藏
- 【BZOJ1924】【SDOI2010】所驼门王的宝藏
- 【bzoj1924】【SDOI2010】所驼门王的宝藏
- 省选专练SDOI2010所驼门王的宝藏
- bzoj1924 所驼门王的宝藏 有向图最长链
- 【codevs2131】【BZOJ1924】所驼门王的宝藏,tarjan+拓扑DP
- [BZOJ1924][SDOI2010]所驼门王的宝藏(Tarjan+拓扑排序)
- 【bzoj1924】[Sdoi2010]所驼门王的宝藏(tarjan+STL+dp)
- [BZOJ]1924: [Sdoi2010]所驼门王的宝藏 强连通+DP
- shell脚本 将非9图和不在黑名单中的png转webp
- unity开发游戏的一些体会
- angularjs 单列排序+模糊查询
- Maven Run As,Maven Build....出错
- Kaldi特征提取之-FBank
- 2017.9.21 所驼门王的宝藏 思考记录
- 【leetcode】整型翻转问题integer reverse
- xlistview加点
- HTTP(一)
- struts2笔记
- TASKCTL设计作业流时该用定时器还是流程
- java面向对象的特性 封装 继承 多态
- 《点到平面的距离公式》推导
- 二级缓存