BZOJ 1924

内存要算准,我MLE了两次。

建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和这一行可以走到它,如果类型为$1, 2$只要连一条到所在行和所在列的边就可以了,但是类型$3$似乎没有什么好的方法,$map$或者$hash$搞一搞,暴力连一连。

然后缩点之后记忆化搜索一下就可求出最长链了。

点数为$n + r + c$最多不超过$2e6 + 1e5$,边数为$2e5 + $最多$8e5$,不会达到这个上界。

时间复杂度$O(nlogn)$,$log$来源于$map$。

Code:

#include <cstdio>
#include <cstring>
#include <map>
#include <iostream>
#include <vector>
using namespace std;
typedef pair <int, int> pin; const int N = 2e6 + 1e5 + ;
const int M = 1e6 + ;
const int dx[] = {-, -, -, , , , , };
const int dy[] = {-, , , -, , -, , }; int n, r, c, tot = , head[N], scc = , bel[N], f[N];
int dfsc = , dfn[N], low[N], top = , stk[N], deg[N];
bool vis[N];
map <pin, int> mp;
vector <int> G[N]; struct Edge {
int to, nxt;
} e[M]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} struct Node {
int x, y, type;
} a[N]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline int min(int x, int y) {
return x > y ? y : x;
} void tarjan(int x) {
dfn[x] = low[x] = ++dfsc;
vis[x] = , stk[++top] = x;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(!dfn[y]) {
tarjan(y);
low[x] = min(low[x], low[y]);
} else if(vis[y])
low[x] = min(low[x], dfn[y]);
} if(low[x] == dfn[x]) {
++scc;
for(; stk[top + ] != x; --top) {
vis[stk[top]] = ;
bel[stk[top]] = scc;
if(stk[top] >= && stk[top] <= n) ++f[scc];
}
}
} void dfs(int x) {
if(vis[x]) return;
int res = , vecSiz = G[x].size();
for(int i = ; i < vecSiz; i++) {
int y = G[x][i];
dfs(y);
chkMax(res, f[y]);
}
f[x] += res;
vis[x] = ;
} int main() {
read(n), read(r), read(c);
for(int i = ; i <= n; i++) {
read(a[i].x), read(a[i].y), read(a[i].type);
mp[pin(a[i].x, a[i].y)] = i;
add(a[i].x + n, i), add(a[i].y + n + r, i);
}
for(int i = ; i <= n; i++) {
if(a[i].type == ) add(i, a[i].x + n);
if(a[i].type == ) add(i, a[i].y + n + r);
if(a[i].type == ) {
for(int j = ; j < ; j++) {
int tox = a[i].x + dx[j], toy = a[i].y + dy[j];
if(tox >= && tox <= r && toy >= && toy <= c) {
if(mp.find(pin(tox, toy)) != mp.end())
add(i, mp[pin(tox, toy)]);
}
}
}
} for(int i = ; i <= n + r + c; i++)
if(!dfn[i]) tarjan(i); for(int x = ; x <= n + r + c; x++) {
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(bel[x] == bel[y]) continue;
G[bel[x]].push_back(bel[y]);
++deg[bel[y]];
}
} for(int i = ; i <= scc; i++)
if(!deg[i]) dfs(i); int ans = ;
for(int i = ; i <= scc; i++)
chkMax(ans, f[i]); printf("%d\n", ans);
return ;
}

Luogu 2403 [SDOI2010]所驼门王的宝藏的更多相关文章

  1. 洛谷 2403 [SDOI2010] 所驼门王的宝藏

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

  2. Luogu P2403 [SDOI2010]所驼门王的宝藏

    比较显然的缩点+拓扑排序题,只不过要建虚点优化建边. 首先我们发现在一个SCC里的点都是可以一起对答案产生贡献的,因此先缩成DAG,然后拓扑找最长链. 但是我们发现这题最坏情况下边数会达到恐怖的\(O ...

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

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

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

  5. 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)

    [题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...

  6. [SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  7. [LuoguP2403][SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

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

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

  9. 【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)

    点此看题面 大致题意: 一个由\(R*C\)间矩形宫室组成的宫殿中的\(N\)间宫室里埋藏着宝藏.由一间宫室到达另一间宫室只能通过传送门,且只有埋有宝藏的宫室才有传送门.传送门分为3种,分别可以到达同 ...

随机推荐

  1. SqlServer 数据库读写分离【转】

    1. 实现原理:读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力.主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操 ...

  2. C#获取文件的MD5码

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Send ...

  3. 7天学会HTML-Day01

    HTML初步 关键词: B/S C/S .服务器访问原理.标签.html特性.列表.图片 1.B/S 和C/S 架构 B/S -> browser/server 浏览器服务器架构 C/S -&g ...

  4. js判断客户端是pc还是手机

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  5. Ambari的API调用

    GET api/v1/clusters/HDP/configurations可以获得所有的配置信息(例如,http://hdp0:8080/api/v1/clusters/HDP/configurat ...

  6. 在html与php中实现上传图片

    form.html文件 <body> 点击浏览按钮添加要上传的文件(*请上传大小不能大于2M的静态图片)<br /> <form enctype="multip ...

  7. bzoj 3796 Mushroom追妹纸——后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 长度一般都是 1e5 ,看这个是 5e4 ,一看就是把两个串接起来做. 自己本来想的是 ...

  8. git 查看、创建、切换、删除、重命名和推送分支

    1.查看本地所有分支:前面有 “*” 的是当前所处的分支 $ git branch test-A * test-B 2.查看本地和远程服务器的所有分支: $ git branch -a test-A ...

  9. nginx config的多个config配置

    在我们的一台服务器上,一个nginx服务器下面可能跑着许多许多的项目; 那么就需要配置多个对应的配置 端口号 已经文件入库目录等等 那么项目多了以后,把这些项目都写到一个文件里 到后期难以查看与管理 ...

  10. expected_conditions 库的使用方法

    from selenium.webdriver.support import expected_conditions as EC 例子一: 例子二:(判断元素存在文本"糯米")