记住: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[j]]);

  而不是

R tmp=mp[x[i]+dx[j]][y[i]+dy[j]];
if(tmp) add(i,tmp);

别问我为什么QAQ

建图:选定一个横天门,向在这一行上的横天门连无向边,剩下的门连有向边;纵寰门一样的方法

用map判 自由_门 旁边八个点是否存在,存在就连边;

最后tarjan缩点,用dp求最长路

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#define R register int
const int dx[]={,,,,,-,-,-},dy[]={,,,-,-,-,,};
using namespace std;
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar())) ;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
#define pb(x) push_back(x)
int k,n,m,cnt=,ind,cc,top,ans,num;
int lst[],lst2[],x[],y[],op[],d[];
int vr[],nxt[],fir[],dfn[],scc[],stk[],low[],c[];
vector<int>a[],b[];
map<int,int> mp[];
bool vis[];
inline void add(int u,int v) {if(u==v) return ;vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
inline void init() {
for(R i=;i<=n;++i) {
R x=,sz=a[i].size();
for(R j=;j<sz;++j) if(op[a[i][j]]==) {x=a[i][j]; break;}
for(R j=;j<sz;++j) {add(x,a[i][j]); if(op[a[i][j]]==) add(a[i][j],x);}
}
for(R i=;i<=m;++i) {
R x=,sz=b[i].size();
for(R j=;j<sz;++j) if(op[b[i][j]]==) {x=b[i][j]; break;}
for(R j=;j<sz;++j) {add(x,b[i][j]); if(op[b[i][j]]==) add(b[i][j],x);}
}
for(R i=;i<=k;++i) if(op[i]==) for(R j=;j<;++j)
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[j]]);void tarjan(int u) { low[u]=dfn[u]=++num; stk[++top]=u,vis[u]=true;
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(vis[v]) low[u]=min(low[u],dfn[v]);
} if(low[u]==dfn[u]) {
R tmp; ++cc;
do tmp=stk[top],--top,vis[tmp]=false,c[tmp]=cc,++scc[cc]; while(tmp!=u);
}
}
int vv[],nn[],ff[];
inline void addc(int u,int v) {vv[++cnt]=v,nn[cnt]=ff[u],ff[u]=cnt;}
inline void solve() {
cnt=; for(R u=;u<=k;++u) for(R i=fir[u];i;i=nxt[i])
if(c[u]!=c[vr[i]]) addc(c[u],c[vr[i]]);
}
inline void dp(int u) { vis[u]=true;
for(R i=ff[u];i;i=nn[i]) { R v=vv[i];
if(!vis[v]) dp(v);
d[u]=max(d[v],d[u]);
} d[u]+=scc[u]; ans=max(d[u],ans);
}
signed main() {
k=g(),n=g(),m=g();
for(R i=;i<=k;++i) {
x[i]=g(),y[i]=g(),op[i]=g();
mp[x[i]][y[i]]=i;
a[x[i]].pb(i),b[y[i]].pb(i);
} init(); for(R i=;i<=k;++i) if(!dfn[i]) tarjan(i);
solve(); memset(vis,false,sizeof(vis));
for(R i=;i<=cc;++i) if(!vis[i]) dp(i);
printf("%d\n",ans); return ;
}

2019.04.21

upd:5秒后 (发布时显示:博文中含有违规内容: 自_由_门! (并没有下划线)    ????不知所言)

BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP的更多相关文章

  1. BZOJ1924 [Sdoi2010]所驼门王的宝藏 【建图 + tarjan】

    题目 输入格式 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti ...

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

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

  3. [bzoj1924]P2403 [SDOI2010]所驼门王的宝藏

    tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times ...

  4. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...

  5. 洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解

    题目描述 分析 先放一张图便于理解 这一道题如果暴力建图会被卡成\(n^{2}\) 实际上,在我们暴力建图的时候,有很多边都是重复的 假如一行当中有许多横天门的话,我们就不必要把这一行当中的所有点和每 ...

  6. bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  7. 洛咕 P2403 [SDOI2010]所驼门王的宝藏

    简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...

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

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

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

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

随机推荐

  1. Agc_006 E Rotate 3x3

    题目大意 给定一个$3\times N$的方阵,每个位置的数恰好是每一个$[1,3\times N]$中的数. 初始时,每个位置$[x,y]$填的是$3(y-1)+x,(1\leq x\leq N,1 ...

  2. 每天一个linux命令(7):rmdir命令

    版权声明更新:2017-05-11博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的rmdir命令. ...

  3. DEBUG命令说明

    Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须得. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...

  4. mysql--事务demo1----

    package com.etc.entity; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  5. svn、git等比较---总结

    免费的版本控制系统: CVS:集中式的版本控制系统,必须联网,速度慢,CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用.由于CVS自身设计的问题,会造成提交文件不完整,版本库莫 ...

  6. linux日常管理-rsync_ssh方式

    现在我们有两台机器,两台机器都需要安装rsync    yum -y install rsync       一台的主机名是wangshaojun IP是192.168.1.117 ,另一台的主机名是 ...

  7. Java接口定义和实现

    1. 使用interface来定义一个接口.接口定义类似类的定义,分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [ ...

  8. centos6 搭建IPSEC

    http://www.maxwhale.com/how-to-install-l2tp-vpn-on-centos/ http://blog.earth-works.com/2013/02/22/ho ...

  9. 网络编程之socket编程实例

    简单实例1 server.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include ...

  10. MySql数据库数据更新操作其高级应用

    数据更新操作有3种:向表中添加数据.修改表中的数据和删除表中的数据. 用来演示的数据表用student.course.sc三个数据表,数据表具体内容在:PHP和MySql数据库,如何获取每个分类的记录 ...