1924: [Sdoi2010]所驼门王的宝藏

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 1303  Solved: 582
[Submit][Status][Discuss]

Description

Input

第 一行给出三个正整数 N, R, C。 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti。Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“目田门”。 保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。

Output

只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。

Sample Input

10 7 7
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1

Sample Output

9

HINT

测试点编号 N R C 1 16 20 20 2 300 1,000 1,000 3 500 100,000 100,000 4 2,500 5,000 5,000 5 50,000 5,000 5,000 6 50,000 1,000,000 1,000,000 7 80,000 1,000,000 1,000,000 8 100,000 1,000,000 1,000,000 9 100,000 1,000,000 1,000,000 10 100,000 1,000,000 1,000,000

Source

【题解】

这题空间卡的太紧了吧。。。

洛谷上死活交不过,就差大概10kb

实在卡不过去了,冒死交BZOJ,居然过了

把门之间建图即可,用map处理九宫格。

每行/列能够行走行/列的门只需选一个,与其他

同类别门连双向,不同类连单向

tarjan + DAG最长路模板

除了DP部分跟hwzer写的很像?

我那么蒟蒻不读上几遍dalao的代码怎么会写。。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <map>
  6 #include <vector>
  7 #define min(a, b) ((a) < (b) ? (a) : (b))
  8 #define max(a, b) ((a) > (b) ? (a) : (b))
  9
 10 inline void read(int &x)
 11 {
 12     x = 0;char ch = getchar(), c = ch;
 13     while(ch < '0' || ch > '9')c = ch, ch = getchar();
 14     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
 15     if(c == '-')x = -x;
 16 }
 17
 18 const int INF = 0x3f3f3f3f;
 19 const int MAXN = 100000 + 1;
 20 const int MAXR = 1000000 + 1;
 21 const int dx[8] = {0,0,1,1,1,-1,-1,-1};
 22 const int dy[8] = {1,-1,0,1,-1,0,1,-1};
 23
 24 std::map<int, int> mp[MAXR];
 25 int r, c, n;
 26 std::vector<int> row[MAXR], line[MAXR];
 27 int x[MAXN], y[MAXN], pos[MAXN];
 28
 29 struct Edge
 30 {
 31     int v,next;
 32     Edge(int _v, int _next){v = _v;next = _next;}
 33     Edge(){}
 34 }edge1[MAXR], edge2[MAXR];
 35 int head1[MAXN], head2[MAXN], cnt1, cnt2;
 36 inline void insert1(int a, int b)
 37 {
 38     edge1[++cnt1] = Edge(b, head1[a]);
 39     head1[a] = cnt1;
 40 }
 41 inline void insert2(int a, int b)
 42 {
 43     edge2[++cnt2] = Edge(b, head2[a]);
 44     head2[a] = cnt2;
 45 }
 46
 47 int dfn[MAXN], t, top, group, size[MAXN];
 48 bool b[MAXN];
 49
 50 void dfs(int u)
 51 {
 52     dfn[u] = y[u] = ++t;b[u] = 1;pos[++top] = u;
 53     for(register int pos = head1[u];pos;pos = edge1[pos].next)
 54     {
 55         if(!dfn[edge1[pos].v])
 56         {
 57             dfs(edge1[pos].v);
 58             y[u] = min(y[u], y[edge1[pos].v]);
 59         }
 60         else if(b[edge1[pos].v] && y[u] > dfn[edge1[pos].v])
 61             y[u] = dfn[edge1[pos].v];
 62     }
 63     if(y[u] == dfn[u])
 64     {
 65         ++ group;
 66         int now = -1;
 67         while(now != u)
 68         {
 69             now = pos[top];-- top;
 70             x[now] = group;
 71             b[now] = 0;
 72             ++ size[group];
 73         }
 74     }
 75 }
 76
 77 void tarjan()
 78 {
 79     for(register int i = 1;i <= n;++ i)
 80         if(!dfn[i]) dfs(i);
 81 }
 82
 83 inline void rebuild()
 84 {
 85     for(register int i = 1;i <= n;++ i)
 86     {
 87         for(register int pos = head1[i];pos;pos = edge1[pos].next)
 88         {
 89             if(x[i] != x[edge1[pos].v]) insert2(x[i], x[edge1[pos].v]);
 90         }
 91     }
 92 }
 93
 94 int f[MAXN], ans;
 95
 96 int dp(int u)
 97 {
 98     if(f[u]) return f[u];
 99     f[u] = size[u];
100     for(register int pos = head2[u];pos;pos = edge2[pos].next)
101         f[u] = max(f[u], dp(edge2[pos].v) + size[u]);
102     ans = max(ans, f[u]);
103     return f[u];
104 }
105
106 int main()
107 {
108     read(n), read(r), read(c);
109     register int i, num, tmp;
110     for(i = 1;i <= n;++ i)
111     {
112         read(x[i]), read(y[i]), read(pos[i]);
113         mp[x[i]][y[i]] = i;
114     }
115     for(i = 1;i <= n;++ i)
116         row[x[i]].push_back(i);
117     for(i = 1;i <= r;++ i)
118     {
119         num = row[i].size(), tmp = 0;
120         for(register int j = 0;j < num;++ j)
121             if(pos[row[i][j]] == 1) {tmp = row[i][j];break;}
122         if(!tmp)continue;
123         for(register int j = 0;j < num;++ j)
124             if(row[i][j] == tmp)continue;
125             else if(pos[row[i][j]] == 1)insert1(tmp, row[i][j]), insert1(row[i][j], tmp);
126             else insert1(tmp, row[i][j]);
127     }
128     for(i = 1;i <= n;++ i)
129         row[x[i]].clear();
130     for(i = 1;i <= n;++ i)
131         line[y[i]].push_back(i);
132     for(i = 1;i <= c;++ i)
133     {
134         num = line[i].size(), tmp = 0;
135         for(register int j = 0;j < num;++ j)
136             if(pos[line[i][j]] == 2){tmp = line[i][j];break;}
137         if(!tmp)continue;
138         for(register int j = 0;j < num;++ j)
139             if(line[i][j] == tmp)continue;
140             else if(pos[line[i][j]] == 2)insert1(tmp, line[i][j]), insert1(line[i][j], tmp);
141             else insert1(tmp, line[i][j]);
142     }
143     for(i = 1;i <= n;++ i)
144         line[y[i]].clear();
145     for(i = 1;i <= n;++ i)
146         if(pos[i] == 3)
147         {
148             for(register int j = 0;j < 8;++ j)
149             {
150                 tmp = mp[x[i] + dx[j]][y[i] + dy[j]];
151                 if(tmp) insert1(i, tmp);
152             }
153         }
154     tarjan();
155     rebuild();
156     for(i = 1;i <= group;++ i)
157         dp(i);
158     printf("%d\n", ans);
159     return 0;
160 }

BZOJ1924

转载于:https://www.cnblogs.com/huibixiaoxing/p/7679761.html

BZOJ1924: [Sdoi2010]所驼门王的宝藏相关推荐

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

    P2403 [SDOI2010]所驼门王的宝藏 题意: R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传 ...

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

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

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

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

  4. 洛谷 2403 [SDOI2010] 所驼门王的宝藏

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

  5. 【SDOI2010】【BZOJ1924】所驼门王的宝藏

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

  6. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

    文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...

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

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

  8. bzoj 1924: [Sdoi2010]所驼门王的宝藏

    23333这个垃圾题之前扒过题解了2333 然而这一次做又错了... 直接暴力连边,然后缩一下点,重构变成DAG,然后DP.. (然而在打tarjan的时候忘掉了inq[now]=0....而且把DP ...

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

    Description Input Output Sample Input 题解: 水题,但还是打表过的-- 这个题目,我们显然可以对关键点进行加边.我就是因为加边加太多了才MLE的,当然对于1,2这 ...

最新文章

  1. android wlan0 网卡过程,android WIFI网络驱动之wpa_supplicant程序详解
  2. 删除计算机系学生的选课记录6,天津理工大学+数据库实验二.doc
  3. DIV+CSS到底是什么?
  4. Catch a cold, will be back later
  5. php中可以实现多态的是继承,PHP设计模式通过继承实现多态
  6. SAP CDS view如何取得当前系统日期和系统时间戳
  7. 计算机组成原理期末复习题
  8. 用户控件 自定义控件_新的自定义控件:TaskProgressView
  9. LeetCode 2196. 根据描述创建二叉树(哈希)
  10. Mac os安装SEAL
  11. 让你提前认识软件开发(14):程序中的算法
  12. HTML5实现扫描识别二维码/生成二维码
  13. 学习pytorch的一些自己犯过的错误而总结的注意事项,估计其他也会使用
  14. Rust: Atom中cargo build error
  15. 4-PSK、4-DPSK、8-QAM信号调制
  16. 如何识别pdf文档中的文字(图像识别)python
  17. VBlog 静态页面 动态博客
  18. JZOJ 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林(凸包+最短路)
  19. SMP_WEIBO_2016 微博用户画像 可视化(未完成)
  20. 基于51单片机的无线测温系统

热门文章

  1. Java jdk环境变量配置只需三步(大三学生亲测有效)
  2. 在华为云服务器安装Anaconda搭建环境体验深度学习——你值得了解一下
  3. M.2-NGFF/NVMe、SATA、mSATA、PCI-e、miniPCI-e接口分析
  4. SecureCRT取消Session记录的密码
  5. 什么是Entity Framework
  6. laravel captcha 验证码不显示 -
  7. maven配置错误:java.lang.ExceptionInInitializerError at com.zsp.dao.UserMapperTest.test
  8. 7-1 大笨钟的心情 (15 分)
  9. vue2基础 - transition 过渡动画结合 animate.css和 Velocity.js 的使用
  10. 苹果CMSv10自定义添加分类详细教程