题目链接

  想到缩点后DP这题就迷之好做

  横天门就点向该行连一条边

  纵门就点向该列连一条边

  ziyou门直接枚举……map搞搞……话说ziyou门为啥是违规内容不让我发布?

  然后缩点,DP,1A

  不过写得迷之心累……想装死……

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cctype>
  5. #include<cstdlib>
  6. #include<map>
  7. #define maxn 2200010
  8. #define maxd 100020
  9. #define base r+c
  10. using namespace std;
  11. inline long long read(){
  12. long long num=,f=;
  13. char ch=getchar();
  14. while(!isdigit(ch)){
  15. if(ch=='-') f=-;
  16. ch=getchar();
  17. }
  18. while(isdigit(ch)){
  19. num=num*+ch-'';
  20. ch=getchar();
  21. }
  22. return num*f;
  23. }
  24.  
  25. int dfn[maxn],cnt;
  26. int stack[maxn],top;
  27. int col[maxn],ID;
  28. bool vis[maxn];
  29. int low[maxn];
  30. int size[maxn],sum[maxn];
  31. bool ext[maxn];
  32. int n,r,c;
  33.  
  34. int ans;
  35.  
  36. struct Pic{
  37. struct Edge{
  38. int next,to;
  39. }edge[maxn*];
  40. int head[maxn],num;
  41. Pic(){memset(head,,sizeof(head));}
  42. inline void add(int from,int to){
  43. edge[++num]=(Edge){head[from],to};
  44. head[from]=num;
  45. }
  46. void tarjan(int x){
  47. //printf("%d\n",x);
  48. dfn[x]=low[x]=++cnt;
  49. vis[x]=; stack[++top]=x;
  50. for(int i=head[x];i;i=edge[i].next){
  51. int to=edge[i].to;
  52. if(dfn[to]==){
  53. tarjan(to);
  54. low[x]=min(low[x],low[to]);
  55. }
  56. else if(vis[to]) low[x]=min(low[x],dfn[to]);
  57. }
  58. if(low[x]==dfn[x]){
  59. col[x]=++ID; vis[x]=;
  60. if(x>base) size[ID]++;
  61. while(stack[top]!=x){
  62. col[stack[top]]=ID;
  63. vis[stack[top]]=;
  64. if(stack[top]>base) size[ID]++;
  65. top--;
  66. }
  67. top--;
  68. }
  69. }
  70. void dfs(int x){
  71. vis[x]=;
  72. for(int i=head[x];i;i=edge[i].next){
  73. int to=edge[i].to;
  74. if(vis[to]){
  75. sum[x]=max(sum[x],sum[to]);
  76. continue;
  77. }
  78. dfs(to);
  79. sum[x]=max(sum[x],sum[to]);
  80. }
  81. sum[x]+=size[x];
  82. ans=max(ans,sum[x]);
  83. return;
  84. }
  85. }Old,New;
  86.  
  87. map<long long,int>d;
  88.  
  89. inline long long calc(long long i,long long j){ return (i-)*c+j+base; }
  90.  
  91. struct Node{
  92. int x,y,id,opt;
  93. }q[maxd];
  94.  
  95. int u[]={,-,-,,,,,,-};
  96. int w[]={,,,,,,-,-,-};
  97.  
  98. int main(){
  99. n=read(),r=read(),c=read();
  100. for(int i=;i<=n;++i){
  101. int x=read(),y=read(),opt=read();
  102. long long now=calc(x,y);
  103. ext[x]=ext[y+r]=ext[i+base]=;
  104. Old.add(x,i+base);
  105. Old.add(y+r,i+base);
  106. q[i]=(Node){x,y,i+base,opt};
  107. d[now]=i+base;
  108. }
  109. for(int i=;i<=n;++i){
  110. int opt=q[i].opt;
  111. if(opt==) Old.add(q[i].id,q[i].x);
  112. else if(opt==) Old.add(q[i].id,q[i].y+r);
  113. else{
  114. for(int j=;j<;++j){
  115. int x=q[i].x+u[j],y=q[i].y+w[j];
  116. if(x<||x>r||y<||y>c) continue;
  117. if(d.count(calc(x,y))) Old.add(q[i].id,d[calc(x,y)]);
  118. }
  119. }
  120. }
  121. for(int i=;i<=n+base;++i)
  122. if(ext[i]&&dfn[i]==) Old.tarjan(i);
  123. for(int i=;i<=n+base;++i)
  124. for(int j=Old.head[i];j;j=Old.edge[j].next){
  125. int to=Old.edge[j].to;
  126. if(col[i]==col[to]) continue;
  127. New.add(col[i],col[to]);
  128. }
  129. for(int i=;i<=ID;++i)
  130. if(vis[i]==) New.dfs(i);
  131. printf("%d\n",ans);
  132. return ;
  133. }

【Luogu】P2403所驼门王的宝藏(强连通分量)的更多相关文章

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

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

  2. BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)

    思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链. 问题在于暴力建图是O(n^2)的, ...

  3. BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  4. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

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

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

  6. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  7. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏

    T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...

  8. noip模拟5[string·matrix·big·所驼门王的宝藏]

    怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...

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

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

随机推荐

  1. POJ-1149 PIGS---最大流+建图

    题目链接: https://vjudge.net/problem/POJ-1149 题目大意: M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每 ...

  2. flash + php对称密钥加密的交互

    这几天研究了下php和flash中的对称密钥加密的交互问题,经过研究以后决定,在项目中使用aes加密.问题也就来了,在flash中的加密数据如何与php的amf进行数据交互,最终决定使用base64编 ...

  3. 第四章 用javascript和DOM去建立一个图片库

    把整个图片库的浏览链接集中安排在你的图片库里,只在用户点击了这个主页里的某个图片链接时才把相应的图片传送给它. 代码如下: <body> <ul> <li> < ...

  4. WARNING: The TCP backlog setting of 511.解决

    redis启动警告问题:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/so ...

  5. PHP中可变变量到底有什么用?

    转自:http://blog.csdn.net/engine_1124/article/details/8660291 什么是可变变量? PHP提供了一种其他类型的变量——可变变量.可变变量允许我们动 ...

  6. linux的一些指令

    linux的一些指令 █查看指令參數man 指令,如:man ls ,按q鍵退出 █查看文件列表ls -lht 按時間排序ll 列表ls 列表 目錄cd 目錄名稱 進入路徑cd .. 返回上層路徑 █ ...

  7. DOS当中的基本操作命令,如何切换磁盘,如何查看文件和文件夹,如何清屏,进入文件夹的命令,javac是什么意思,作用是什么?DOS如何建文件夹?退出文件夹?

    如何切换磁盘:使用盘符+:举例 d: 如何查看文件和文件夹 dir/w 如何清屏: cls (clear screen) 进入文件夹的命令cd ,举例cd JDK javac是什么意思,c 是comp ...

  8. mysql 绿色版 安装

    1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...

  9. flask-bootstrap

    pip install bootstarp 使用bower安装bootstrap的命令是: bash$ bower install bootstrap不过问题出在如何安装bower上. 官方网站上这样 ...

  10. js浮点数加减乘除

    浮点数精确计算 /** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:ac ...