bzoj 1924
所用点的编号为输入顺序,因为只有在存在联通门的宫室中存在宝藏。其余点不考虑
对于每一行,选定一个横天门,向该行横天门连双向边,其余门单向边
纵列同理
自.由门用map判周围八个点是否存在,存在即连边
Tarjan缩点后DAG上dp求最长路
bzoj 可过,luogu卡空间
#include <bits/stdc++.h>
#define gc getchar()
inline int read() {
int x = ;
char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
}
const int N = 1e5 + , M = 1e6 + ;
const int xd[] = {, -, -, -, , , , };
const int yd[] = {-, -, , , , , , -};
int head[N], head_2[N], cnt;
struct Node {
int u, v, nxt;
};
Node G[M], E[M];
std:: vector <int> Vecx[M], Vecy[M];
std:: map <int, int> Map[M];
int X[N], Y[N], Opt[N];
int Q, n, m;
int Low[N], Dfn[N], Stack[N], Belong[N], Size[N], Scc, Tim, topp;
bool vis[N];
inline void Add_1(int u, int v) {
if(u == v) return ;
G[++ cnt].v = v;
G[cnt].nxt = head[u];
head[u] = cnt;
}
inline void Add_2(int u, int v) {
E[++ cnt].v = v;
E[cnt].nxt = head_2[u];
head_2[u] = cnt;
}
inline void Build() {
memset(head, -, sizeof head);
for(int i = ; i <= n; i ++) {
int x = , s = Vecx[i].size();
for(int j = ; j < s; j ++) {
if(Opt[Vecx[i][j]] == ) {
x = Vecx[i][j]; break;
}
}
for(int j = ; j < s; j ++) {
Add_1(x, Vecx[i][j]);
if(Opt[Vecx[i][j]] == ) Add_1(Vecx[i][j], x);
}
}
for(int i = ; i <= m; i ++) {
int y = , s = Vecy[i].size();
for(int j = ; j < s; j ++) {
if(Opt[Vecy[i][j]] == ) {
y = Vecy[i][j]; break;
}
}
for(int j = ; j < s; j ++) {
Add_1(y, Vecy[i][j]);
if(Opt[Vecy[i][j]] == ) Add_1(Vecy[i][j], y);
}
}
for(int i = ; i <= Q; i ++) {
if(Opt[i] == ) {
for(int j = ; j < ; j ++) {
int t = Map[X[i] + xd[j]][Y[i] + yd[j]];
if(t) Add_1(i, t);
}
}
}
}
void Tarjan(int x) {
Low[x] = Dfn[x] = ++ Tim;
Stack[++ topp] = x;
vis[x] = ;
for(int i = head[x]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(!Dfn[v]) {
Tarjan(v);
Low[x] = std:: min(Low[x], Low[v]);
} else if(vis[v]) Low[x] = std:: min(Low[x], Low[v]);
}
if(Dfn[x] == Low[x]) {
vis[x] = , Belong[x] = ++ Scc;
Size[Scc] = ;
while(Stack[topp] != x) {
vis[Stack[topp]] = , Belong[Stack[topp]] = Scc;
topp --;
Size[Scc] ++;
}
topp --;
}
}
inline void Rebuild() {
cnt = ;
memset(head_2, -, sizeof head_2);
for(int u = ; u <= Q; u ++)
for(int i = head[u]; ~ i; i = G[i].nxt)
if(Belong[u] != Belong[G[i].v]) Add_2(Belong[u], Belong[G[i].v]);
}
int Answer, tot[N];
void Dfs(int u) {
vis[u] = ;
for(int i = head_2[u]; ~ i; i = E[i].nxt) {
int v = E[i].v;
if(!vis[v]) Dfs(v);
tot[u] = std:: max(tot[u], tot[v]);
}
tot[u] += Size[u];
Answer = std:: max(Answer, tot[u]);
}
int main() {
Q = read(), n = read(), m = read();
for(int i = ; i <= Q; i ++) {
X[i] = read(), Y[i] = read(), Opt[i] = read();
Vecx[X[i]].push_back(i);
Vecy[Y[i]].push_back(i);
Map[X[i]][Y[i]] = i;
}
Build();
for(int i = ; i <= Q; i ++) if(!Dfn[i]) Tarjan(i);
Rebuild();
memset(vis, , sizeof vis);
for(int i = ; i <= Scc; i ++) if(!vis[i]) Dfs(i);
std:: cout << Answer;
return ;
}
bzoj 1924的更多相关文章
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)
思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链. 问题在于暴力建图是O(n^2)的, ...
- 「BZOJ 1924」「SDOI 2010」所驼门王的宝藏「Tarjan」
题意 一个\(r\times c\)的棋盘,棋盘上有\(n\)个标记点,每个点有三种类型,类型\(1\)可以传送到本行任意标记点,类型\(2\)可以传送到本列任意标记点,类型\(3\)可以传送到周围八 ...
- 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 ...
- 所驼门王的宝藏(bzoj 1924)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】
Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...
- bzoj 1924 所驼门王的宝藏
题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
随机推荐
- Apache Tomcat 安装与配置教程
JDK的安装与配置 1. 从官网下载JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213315 ...
- asp.net core-9.依赖注入的使用
http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/
- Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!
在一个月黑风高的夜晚,突然收到现网生产环境Kafka消息积压的告警,梦中惊醒啊,马上起来排查日志. 问题现象:消费请求卡死在查找Coordinator Coordinator为何物?Coordinat ...
- MySQL 使用tee记录语句和输出日志
在mysql命令行中,使用tee命令,可以记录语句和输出到指定文件.在debugging时会很有用.每执行一条语句,mysql都会讲执行结果刷新到指定文件.Tee功能只在交互模式生效. mysql&g ...
- win8系统安装.net Framework3.5
Win8 离线安装 .Net Framework 3.5(工具+方法)(支持Win8.1) 微软在最新的 Win8 / Win8.1 系统中没有集成 .NET 3.5,如果安装的话,必须是在线安装,甚 ...
- solr-jd
springMVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- spring源码(1)---idea基础环境搭建
一.环境准备 1. jdk1.8.1 做java开发的这个应该能自己找到 2.gradle-4.9 https://services.gradle.org/distributions/ 没用过grad ...
- DRF 01
目录 DRF 接口 概念 YApi接口文档 Postman接口测试 RESTful接口规范 URL设计 响应结果 响应状态码 数据状态码 数据状态信息 数据本身 五大请求方式 简单实现 DRF drf ...
- 数据库入门(mySQL):数据操作与查询
增删改 单表查询 多表查询 一.增删改 1.插入数据记录(增) insert into table_name(field1,field2,field3,...fieldn) valuses(value ...
- [Vuex系列] - 细说state的几种用法
state 存放的是一个对象,存放了全部的应用层级的状态,主要是存放我们日常使用的组件之间传递的变量. 我们今天重点讲解下state的几种用法,至于如何从头开始创建Vuex项目,请看我写的第一个文章. ...