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. 关键的OOP概念

    OOP的好处  1.封装, 2继承, 3多态. 多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. <? ...

  2. Git学习资源收集汇总

    伴随着知乎上一个问题:GitHub 是怎么火起来的?被顶起200+的回答说到:Github不是突然火起来的,在Ruby社区Github其实从一开始就很流行,我们2009年搞Ruby大会就邀请了Gith ...

  3. wordpress改不了固定连接的解决办法

    经常遇到更改了固定连接刷新没效果>>>>>>>废话不多说直接上步骤,有图有真相. 1,ftp删除根目录的这个文件夹 2,进入wp后台设置-固定连接—自定义结构 ...

  4. AbstractIdleService

    该类有一个startup和shutdown方法,启动此服务或者结束此服务的时候可以调用. Runtime.getRuntime().addShutdownHook(new Thread() {@Ove ...

  5. (转)android平台下使用点九PNG技术

    “点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向, ...

  6. install OS from usb

      https://unetbootin.github.io/ https://rufus.akeo.ie/

  7. 关于Android Studio上得处女座福音功能——reformat code

    在mac上,选中需要的代码,然后 Option+(shift) + Command + L 全部重新排列!!爽飞!

  8. laravel 中条件查询 function模式

    当需要条件查找时,可以使用下面的注入方法: //我要预约 yudoc_name yudoc_keshi yudoc_jibing yudoc_hospital 这是需要帅选的条件 public fun ...

  9. Python3 的urllib实例

    在Python3中合并了 urllib 和 urllib2, 统一命名为 urllib 了,我觉得这样更加合理了.让我们可以像读取本地文件一样读取WEB上的数据.封装了一个类,供以后方便使用吧!并附带 ...

  10. mysql5.7不支持0000-00-00 00:00:00的默认时间设置

    方案一: 数据不多的话把原有的5.53的数据改一下符合要求(数据库时间字段里千万不能出现0000-00-00 00:00:00这样的值),然后导出.sql文件,导出的.sql文件里把 DEFAULT ...