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个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
随机推荐
- Qt中的常用容器类(解释比较全面,有插图)
在Qt库中为我们提供了一系列的基于模板的容器类.这些类可以被用来存储特定类型的项.例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector<QString>. 这些容 ...
- IntelliJ IDEA 最新版 2019.2.4 激活 (持续更新)(含windows和Mac)
IntelliJ IDEA 最新版 2019.2.4 激活 最新版激活包下载地址: 百度网盘 提取码: i28c 转载: Neo Peng Jetbrains系列产品 激活方式 同下述方式相同,只需要 ...
- Html5+Mui前端框架,开发记录(三):七牛云 上传图片
1.Html界面: <div id="container"> <label>凭证:</label> <div id="uploa ...
- .net Core CLR
.net Core CLR是开源的.大部分文件是C++写成.这样他就可以编译后再不同的平台运行. https://github.com/dotnet/coreclr
- log4j2.xml配置,导致启动报错
项目中遇到问题,当使用tomcat启动时,没问题:当使用内置tomcat启动时却报错,找不到日志路径. 变量位置: <properties> <property name=" ...
- centos 随机启动脚本编写
先说下问题背景 目前手上开发的产品是springboot微服务的,我们用jenkins来做的部署,部署脚本如下: 1.build脚本 负责从git服务器拉脚本 2.微服务脚本: #!/bin/shap ...
- (详细)JAVA使用JDBC连接MySQL数据库(1)- 软件
欢迎任何形式的转载,但请务必注明出处. 本节为下面四个的安装和配置 jdk Eclipse MySQL mysql connectors 一.jdk 点击查看安装和环境配置教程 二.Eclipse 点 ...
- EF方式增加数据
单条记录添加 第一种方式: public void AddRegion() { using(Northwind db = new Northwind()) { Region regi ...
- golang GC(二 定位)
前面已经介绍过golang的GC算法.要是我们的程序在运行是因为GC导致行能下降,该如何定位呢?说实话,工作中由于对go的gc问题不重视,根本没考虑过这个问题,今天特意来补补课.
- JavaScript基础概念与语法
学习了一些最基础的JavaScript语法: <!DOCTYPE html> <html lang="en"> <head> <meta ...