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个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
随机推荐
- Linux下/etc/login.defs文件
/etc/login.defs文件定义了与/etc/password和/etc/shadow配套的用户限制设定.这个文件是需要的,缺失并不会影响系统的使用,但是也许会产生意想不到的错误. 如果/etc ...
- 2020年AI、CV、NLP顶会最全时间表
2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40 2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地 ...
- C# DateTime Subtract
DateTime start = DateTime.Now.AddDays(-20); DateTime end = DateTime.Now; TimeSpan ts = end.Subtract( ...
- (四)输入参数与输出类型为复杂类型的web服务
一. 服务端发布服务 1.1 定义复杂类型:UserBean.java package service; public class UserBean { private String userId; ...
- Word文档转PDF方法探索
最近的项目中需要将Word转换为PDF文件,找了很多方法和组件,最后找到了一些方法,和大家分享. 一.使用微软官方自带转换方法 好处是写法方便,官方支持,缺点是需要在服务器上安装office,而且要配 ...
- JDBC 学习复习9 配置Tomcat数据源
在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用T ...
- VUE CLI3 less 全局变量引用
方法一 1.添加依赖 style-resources-loader 2.vue.config.js中添加 module.exports = { pluginOptions: { 'style-reso ...
- stm32 ADC模数转换 ADC多通道 ADC DMA
通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...
- gitlab安装教程 正在修炼的西瓜君
查看内存配置 我们先不急着来安装gitlab,先来看一下自己电脑的内存情况,我把这一步提到最前面,是因为这是我安装过程中遇到的最大的坑. 下面是gitlab的cpu和内存需求(https://do ...
- C和指针--命令行参数
1.命令行参数 C程序的main函数具有两个形参,第1个通常称为argc,它表示命令行参数的数目.第2个称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值(本质 ...