所用点的编号为输入顺序,因为只有在存在联通门的宫室中存在宝藏。其余点不考虑
对于每一行,选定一个横天门,向该行横天门连双向边,其余门单向边
纵列同理
自.由门用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的更多相关文章

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

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

  2. bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)

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

  3. 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏

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

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

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

  5. 「BZOJ 1924」「SDOI 2010」所驼门王的宝藏「Tarjan」

    题意 一个\(r\times c\)的棋盘,棋盘上有\(n\)个标记点,每个点有三种类型,类型\(1\)可以传送到本行任意标记点,类型\(2\)可以传送到本列任意标记点,类型\(3\)可以传送到周围八 ...

  6. 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 ...

  7. 所驼门王的宝藏(bzoj 1924)

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

  8. BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】

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

  9. bzoj 1924 所驼门王的宝藏

    题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...

随机推荐

  1. MongoDB writeConcern原理解析--转载

    MongoDB支持客户端灵活配置写入策略(writeConcern),以满足不同场景的需求. db.collection.insert({x: 1}, {writeConcern: {w: 1}}) ...

  2. 13_日期时间、Math、枚举

    日期时间.Math.枚举 日期时间 计算机如何表示时间? GMT时间指格林尼治所在地的标准时间,也称为时间协调时(UTC),其他地区的时间都是相对于GMT时间的偏移.   北京位于东八区 = UTC ...

  3. Linux 编译kernel有关Kconfig文件详解

    ref : https://blog.csdn.net/Ultraman_hs/article/details/52984929 Kconfig的格式 下面截取/drivers/net下的Kconfi ...

  4. Flash播放控件属性详解

    Flash 播放控件属性详解 一.属性篇 1.AlignMode(读写)  语法:AlignMode As Long  说明:对齐方式(与SAlign 属性联动).当控件的长宽比例与影片不一致且WMo ...

  5. Html5+Mui前端框架,开发记录(四):下拉菜单绑定数据、搜索、时间控件

    1.下拉菜单绑定数据,选择后回传值 1)html: <div class="mui-input-row"> <label>xxx:</label> ...

  6. 前端开发 Vue -3axios

    Axios是什么? 应该念“阿克希奥斯”……但是太长太拗口,我一般念“阿笑斯”…… Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get.post请求.说到get.po ...

  7. 分析js跳出循环的几种方法

    Break语句: break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句. 由于它是用来退出循环或者switch语句的, 所以只有当它出现在这些语句的时候, 这种形式的br ...

  8. Django admin 外键关联默认显示用户的username

    使用默认User表.默认显示用户username,转换成get_full_name() /home/labsmith/venv_labsmit/lib/python3.6/site-packages/ ...

  9. rabbitMQ 安装,基于Windows环境

    参考文章:https://www.cnblogs.com/ericli-ericli/p/5902270.htmlRabbit MQ 是建立在Erlang OTP平台上,安装前需先安装Erlang.h ...

  10. MySQL5.7.28免安装版配置

    下载 安装配置 问题及解决方案 一.下载 找到你要的版本点击“looking for the latest GA version?”切换,我这个安装的是5.7.28,然后往下拉: 找到免安装的压缩包: ...