比较显然的缩点+拓扑排序题,只不过要建虚点优化建边

首先我们发现在一个SCC里的点都是可以一起对答案产生贡献的,因此先缩成DAG,然后拓扑找最长链。

但是我们发现这题最坏情况下边数会达到恐怖的\(O(n^2)\),因此我们可以对于每种门进行讨论:

  • 横天门:将该点向这个点坐在的格子的横坐标建立虚点并连边
  • 纵寰门:将该点向这个点坐在的格子的纵坐标建立虚点并连边
  • ZY门:暴力八个方向直接连边即可,(拿map存坐标吧,不会T的)

然后每个点对应横纵坐标的虚点都向这个点连边,这样就可以处理同行/列的情况。

不过这样写Tarjan就要注意常数问题了(点数边数\(10000000+\)),手动卡常松松松

CODE

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<map>
  4. #include<utility>
  5. #include<cstring>
  6. #define mp make_pair
  7. using namespace std;
  8. const int N=100005,R=1000005;
  9. const int fx[8]={0,1,0,-1,1,1,-1,-1},fy[8]={1,0,-1,0,1,-1,1,-1};
  10. map <pair<int,int>,int> h;
  11. int n,r,c,cnt,head[N+(R<<1)],nhead[N+(R<<1)],dfn[N+(R<<1)],stack[N+(R<<1)],low[N+(R<<1)],s[N+(R<<1)],tot,scc,top,col[N+(R<<1)],ru[N+(R<<1)],d[N+(R<<1)],q[N+(R<<1)];
  12. bool vis[N+(R<<1)];
  13. struct data
  14. {
  15. int x,y,opt;
  16. }a[N];
  17. struct edge
  18. {
  19. int to,next;
  20. }e[N<<3],ne[N<<3];
  21. inline char tc(void)
  22. {
  23. static char fl[100000],*A=fl,*B=fl;
  24. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  25. }
  26. inline void read(int &x)
  27. {
  28. x=0; char ch; while (!isdigit(ch=tc()));
  29. while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  30. }
  31. inline void add(int x,int y)
  32. {
  33. e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
  34. }
  35. inline void nadd(int x,int y)
  36. {
  37. ne[++cnt].to=y; ne[cnt].next=nhead[x]; nhead[x]=cnt;
  38. }
  39. inline void build(int x,int y,int id)
  40. {
  41. for (register int i=0;i<8;++i)
  42. {
  43. int xx=x+fx[i],yy=y+fy[i];
  44. if (xx>0&&xx<=r&&yy>0&&yy<=c&&h[mp(xx,yy)]) add(id,h[mp(xx,yy)]);
  45. }
  46. }
  47. inline void miner(int &x,int y)
  48. {
  49. if (y<x) x=y;
  50. }
  51. inline void maxer(int &x,int y)
  52. {
  53. if (y>x) x=y;
  54. }
  55. inline void Tarjan(int now)
  56. {
  57. dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
  58. for (register int i=head[now];~i;i=e[i].next)
  59. if (!dfn[e[i].to]) Tarjan(e[i].to),miner(low[now],low[e[i].to]);
  60. else if (vis[e[i].to]) miner(low[now],dfn[e[i].to]);
  61. if (dfn[now]==low[now])
  62. {
  63. col[now]=++scc; vis[now]=0; s[scc]=(now<=n);
  64. while (stack[top]!=now)
  65. col[stack[top]]=scc,vis[stack[top]]=0,s[scc]+=(stack[top--]<=n); --top;
  66. }
  67. }
  68. inline int top_sort(void)
  69. {
  70. register int i,H=0,T=0; int ans=0;
  71. for (i=1;i<=scc;++i) if (!ru[i]) q[++T]=i,d[i]=s[i];
  72. while (H<T)
  73. {
  74. int now=q[++H]; maxer(ans,d[now]);
  75. for (i=nhead[now];~i;i=ne[i].next)
  76. {
  77. maxer(d[ne[i].to],d[now]+s[ne[i].to]);
  78. if (!(--ru[ne[i].to])) q[++T]=ne[i].to;
  79. }
  80. }
  81. return ans;
  82. }
  83. int main()
  84. {
  85. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  86. register int i,j; read(n); read(r); read(c);
  87. memset(head,-1,sizeof(head)); memset(nhead,-1,sizeof(nhead));
  88. for (i=1;i<=n;++i)
  89. {
  90. read(a[i].x); read(a[i].y); read(a[i].opt);
  91. switch (a[i].opt)
  92. {
  93. case 1:add(i,n+a[i].x);break;
  94. case 2:add(i,n+r+a[i].y);break;
  95. }
  96. add(n+a[i].x,i); add(n+r+a[i].y,i); h[mp(a[i].x,a[i].y)]=i;
  97. }
  98. for (i=1;i<=n;++i) if (a[i].opt==3) build(a[i].x,a[i].y,i);
  99. for (i=1;i<=n+r+c;++i) if (!dfn[i]) Tarjan(i);
  100. for (cnt=0,i=1;i<=n+r+c;++i)
  101. for (j=head[i];~j;j=e[j].next)
  102. if (col[i]!=col[e[j].to]) nadd(col[e[j].to],col[i]),++ru[col[i]];
  103. return printf("%d",top_sort()),0;
  104. }

Luogu P2403 [SDOI2010]所驼门王的宝藏的更多相关文章

  1. BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP

    记住:map一定要这么用: if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy ...

  2. [bzoj1924]P2403 [SDOI2010]所驼门王的宝藏

    tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times ...

  3. 洛咕 P2403 [SDOI2010]所驼门王的宝藏

    简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...

  4. 洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解

    题目描述 分析 先放一张图便于理解 这一道题如果暴力建图会被卡成\(n^{2}\) 实际上,在我们暴力建图的时候,有很多边都是重复的 假如一行当中有许多横天门的话,我们就不必要把这一行当中的所有点和每 ...

  5. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...

  6. [BZOJ 1924][Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1285  Solved: 574[Submit][Sta ...

  7. 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)

    [题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...

  8. [SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  9. [LuoguP2403][SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

随机推荐

  1. 安卓开发中strings.xml的使用

    为了使用方便也是为了代码规范化,我们都将文字信息放在res-values-strings.xml中, 因为开发中需要用到将文字的换行,百度了一下,可以将文字段信息直接在strings.xml文件中换行 ...

  2. tinypng upload一键压缩上传工具,告别人肉

    地址 项目地址:tinypng-upload 有兴趣的可以玩一玩,因为平时经常会用到图片压缩,上传,如果你也觉得很繁琐的话,这个将会解决你的痛点. 关于 tinypng-upload 这是一个基于 e ...

  3. 单页面登录——编码传参(oa会对#号会进行截断)

    /** * querystring有四种方法:注意queryString与query-string不是同一个依赖包 *  querystring.stringify 序列化; *  querystri ...

  4. Echarts地图展示及属性分析

    Echarts,一个效果非常棒的可视化库,可以生产各种图表,动态展示,附上官方网址:http://www.echartsjs.com/index.html 之前带本科实习时有同学用过,狗哥的博客也用这 ...

  5. python第七十六天--堡垒机完成

    堡垒机windows ,linux 都通过测试初始化说明: #进入根目录 1.初始化表结构 #python3 bin/start.py syncdb 2.创建堡垒机用户 #python3 bin/st ...

  6. python第四十三天--第三模块考核

    面向对象: 概念:类,实例化,对象,实例 属性: 公有属性:在类中定义 成员属性:在方法中定义 私有属性:在方法中使用 __属性  定义 限制外部访问 方法: 普通方法 类方法: @classmeth ...

  7. sklearn datasets模块学习

    sklearn.datasets模块主要提供了一些导入.在线下载及本地生成数据集的方法,可以通过dir或help命令查看,我们会发现主要有三种形式:load_<dataset_name>. ...

  8. Hadoop2.7.6_03_HDFS原理

    1. HDFS前言 l  设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l  在大数据系统中作用: 为各类分布式运算框架(如:m ...

  9. 2018. first week now at home

    外面雪刚停. 现在是2018.1.5 2018 needs to consider next steps了.未雨绸缪啊     下面是2017年last working day   外面黑了,水面上黑 ...

  10. ActiveMQ安装配置及使用

    ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管J ...