「BZOJ 1924」「SDOI 2010」所驼门王的宝藏「Tarjan」
题意
一个\(r\times c\)的棋盘,棋盘上有\(n\)个标记点,每个点有三种类型,类型\(1\)可以传送到本行任意标记点,类型\(2\)可以传送到本列任意标记点,类型\(3\)可以传送到周围八连通任意标记点。求最长路径。
\(r,c\leq 10^6,n\leq 10^5\)
题解
这题做法很多,我就把每一行的所有类型\(1\)门缩到一起(直接找一个代表),列也同理,然后暴力连边,类型\(3\)连边用\(\text{map}\),这样每个点的入边中类型\(1\)或\(2\)最多有\(1\)条,类型\(3\)最多\(8\)条,大概可以说明边数和点数同阶,于是\(\text{Tarjan}\)缩点然后\(dp\)求最长路...
#include <algorithm>
#include <utility>
#include <cstdio>
#include <vector>
#include <stack>
#include <map>
using namespace std;
const int N = 1e5 + 10;
const int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
const int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
struct node {
int x, y, z, sz;
} a[N];
int n, r, c, f[N], rt[2][N * 10], dT[N];
vector<int> ob[2][N * 10], G[N], T[N];
map<pair<int, int>, int> ma;
bool isr[N];
int dfn[N], low[N], sz[N], bel[N], scc;
stack<int> st;
bool ins[N];
void tarjan(int u) {
low[u] = dfn[u] = ++ dfn[0];
st.push(u); ins[u] = 1;
for(int i = 0; i < G[u].size(); i ++) {
int v = G[u][i];
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if(ins[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if(low[u] == dfn[u]) {
scc ++;
while(1) {
int v = st.top(); st.pop();
ins[v] = 0; bel[v] = scc;
sz[scc] += a[v].sz;
if(u == v) break ;
}
}
}
int pa[N];
int solve(int u) {
if(pa[u]) return pa[u];
for(int i = 0; i < T[u].size(); i ++) {
pa[u] = max(pa[u], solve(T[u][i]));
}
pa[u] += sz[u];
return pa[u];
}
int main() {
scanf("%d%d%d", &n, &r, &c);
for(int i = 1; i <= n; i ++) {
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
ma[make_pair(a[i].x, a[i].y)] = i;
ob[0][a[i].x].push_back(i);
ob[1][a[i].y].push_back(i);
a[i].sz = 0;
}
for(int i = 1; i <= n; i ++) {
if(a[i].z == 1) {
int &u = rt[0][a[i].x];
if(!u) u = i;
a[u].sz ++; f[i] = u;
}
if(a[i].z == 2) {
int &u = rt[1][a[i].y];
if(!u) u = i;
a[u].sz ++; f[i] = u;
}
if(a[i].z == 3) {
f[i] = i;
a[i].sz ++;
}
isr[f[i]] = 1;
}
for(int i = 1; i <= n; i ++)
if(isr[i]) {
if(a[i].z == 1) {
for(int j = 0; j < ob[0][a[i].x].size(); j ++) {
int v = ob[0][a[i].x][j];
G[i].push_back(f[v]);
}
}
if(a[i].z == 2) {
for(int j = 0; j < ob[1][a[i].y].size(); j ++) {
int v = ob[1][a[i].y][j];
G[i].push_back(f[v]);
}
}
if(a[i].z == 3) {
for(int j = 0; j < 8; j ++) {
int v = ma[make_pair(a[i].x + dx[j], a[i].y + dy[j])];
if(v) {
G[i].push_back(f[v]);
}
}
}
}
for(int i = 1; i <= n; i ++)
if(isr[i] && !dfn[i]) {
tarjan(i);
}
for(int i = 1; i <= n; i ++) {
if(isr[i]) {
for(int j = 0; j < G[i].size(); j ++) {
int v = G[i][j];
if(bel[i] != bel[v]) {
T[bel[i]].push_back(bel[v]);
dT[bel[v]] ++;
}
}
}
}
int ans = 0;
for(int i = 1; i <= scc; i ++)
if(!dT[i]) {
ans = max(ans, solve(i));
}
printf("%d\n", ans);
return 0;
}
「BZOJ 1924」「SDOI 2010」所驼门王的宝藏「Tarjan」的更多相关文章
- BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】
Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...
- 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)
「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)
最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...
- 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 && 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列的藏宝宫室 ...
随机推荐
- js操作indexedDB增删改查示例
js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var r ...
- DRF之权限认证频率组件
概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...
- Axure RP的基础使用
Axure RP是一个专业的快速原型设计工具. 在上面可以直接设计软件的原型而且不涉及代码,例如设计软件的流程和界面之类的.简单的说,就是可以在上面编写界面,让人看起来像一个完整的软件一样. 设置完成 ...
- iTunes 安装ipa文件到iPhone上
iTunes 安装ipa文件到iPhone上 把ipa文件拖到itunes里面. ipa(iPhoneApplication) 菜单 File>Add File to Library>Se ...
- 时区时差换算(GMT,UTC,PST,PDT)
2014年美国冬令时标准时间Stardand Time于11月2号开始实施,直到2015年3月8号为止. 冬令时,是指在冬天使用的标准时间.在使用日光节约时制(夏令时)的地区,夏天时钟拨快一小时,冬天 ...
- 服务器发送邮件出现Could not connect to SMTP host错误 解决办法
服务器发送邮件出现Could not connect to SMTP host错误 解决办法 功夫不负有心人,最后了解到,除了google的smtp服务器收到请求“smtp”会接受,其他服务器比如qq ...
- Clean小程序(控件消息)
一 . 准备工作 创建一个基于对话框的MFC项目 删除对话框上的工具 二 . 实现将seven图片贴到上面,按一下则换一张图片 1.在资源视图中添加位图资源,通过属性修改图片ID 2.将对话框拉长,防 ...
- 常用的软件设计模式的Java实现——让编程从野生到飞起
常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av7596511/
- Dom对象与jQuery对象的转换
- 【总结整理】原创概念原创idea---摘自《结网》
假如你有一个原创想法,搜索引擎是否已有现成产品与自己的想法一致,如果有,研究他可以节省很多摸索的时间:若没有,那就是一个货真价实的原创idea: 第一类:受到现有产品的启发,将既有概念进行了转换. 第 ...