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个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
随机推荐
- Python 同级目录import报错
在使用protobuf时,我们自己了各种Options的时候,在生成的python文件会在同级目录中引用,所以这个时候我们不能做到,加个__init__.py文件了事然后在文件里面写 import m ...
- (十二)Activitivi5之流程控制网关:排他
一.概念 所谓排他网关 顾名思义 执行到该网关,根据条件只能走一条执行线 二.案例 当流程走到“学生请假”任务节点的时候, /** * 完成任务 */ @Test public void test_c ...
- iOS音频频谱动画,仿QQ录音频谱
先上效果图: display.gif 有需要的请移步GitHub下载: https://github.com/HuangGY1993/GYSpectrum 用法很简单,示例: SpectrumView ...
- 简单实现app使用PC图片
提一个很人性化的需求: 在自己的app里使用PC里的图片. 关键点:传输.怎么把图片从PC导入自己的APP. 因为iOS的封闭性,一般用户不能很方便把图片导入手机相册.笔者稍微想了下,实现功能其实也有 ...
- ASE19团队项目 beta阶段 model组 scrum5 记录
本次会议于12月6日,19时30分在微软北京西二号楼sky garden召开,持续20分钟. 与会人员:Jiyan He, Lei Chai, Linfeng Qi, Xueqing Wu, Kun ...
- 跨平台打开一个URL的方法
unit u_urlOpen; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System ...
- 【Zookeeper】 在Java中的操作
一.基本功能演示 1.1 Maven依赖信息 1.2 代码演示 方法说明 1.3 创建Zookeeper节点信息 二.Watcher 2.1 什么是Watcher接口 2.2 Watcher代码 一. ...
- coding++ :MySQL函数——FIND_IN_SET()
语法:FIND_IN_SET(str,strlist) 定义: 1). 假如字符串 str 在由N子链组成的字符串列表 strlist 中,则返回值的范围在1到N之间. 2). 一个字符串列表就是一个 ...
- LVS介绍及相关配置
一. LVS概述 LVS是一种工作在四层协议上的负载均衡解决方案,在1998年5月由章文嵩博士创建.目前广泛使用的负载均衡模型主要有: 1)工作在四层协议(LVS):主要用于四层协议上的负载均衡,性能 ...
- nmap中文帮助文档
简介: Nmap(“ Network Mapper ”)是用于网络探索和安全审核的开源工具.它设计用于快速扫描大型网络,尽管它可以在单个主机上正常运行.Nmap以新颖的方式使用原始IP数据包来确定网络 ...