简单tarjan。

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

然后tarjan直接dp。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
std::map<std::pair<int,int>,int>M;
struct yyb{int x,y,o,i;}s[100010];
int fir[100010],dis[1000010],nxt[1000010],id;
il vd link(int a,int b){nxt[++id]=fir[a],fir[a]=id,dis[id]=b;}
il bool cmp1(const yyb&a,const yyb&b){
if(a.x!=b.x)return a.x<b.x;
else return a.o==1;
}
il bool cmp2(const yyb&a,const yyb&b){
if(a.y!=b.y)return a.y<b.y;
else return a.o==2;
}
const int dX[]={1,1,1,0,0,-1,-1,-1},dY[]={1,0,-1,1,-1,1,0,-1};
int dfn[100010],low[100010],stk[100010],top,ins[100010],scc[100010],w[100010];
std::vector<int>S[100010];
il vd tarjan(int x){
dfn[x]=low[x]=++dfn[0];stk[++top]=x;ins[x]=1;
for(int i=fir[x];i;i=nxt[i])
if(!dfn[dis[i]])tarjan(dis[i]),low[x]=std::min(low[x],low[dis[i]]);
else if(ins[dis[i]])low[x]=std::min(low[x],dfn[dis[i]]);
if(dfn[x]==low[x]){
++scc[0];
while(stk[top+1]!=x)ins[stk[top]]=0,scc[stk[top]]=scc[0],S[scc[0]].push_back(stk[top]),--top;
}
}
int f[100010];
il int dp(int x){
if(f[x])return f[x];
for(int i=0;i<S[x].size();++i)
for(int j=fir[S[x][i]];j;j=nxt[j])
if(scc[dis[j]]!=x)
f[x]=std::max(f[x],dp(scc[dis[j]]));
return f[x]=f[x]+S[x].size();
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2403.in","r",stdin);
freopen("2403.out","w",stdout);
#endif
int n=gi(),r=gi(),c=gi();
for(int i=1;i<=n;++i)s[i].x=gi(),s[i].y=gi(),s[i].o=gi(),s[i].i=i,M[std::make_pair(s[i].x,s[i].y)]=i;
int lst;
std::sort(s+1,s+n+1,cmp1);
lst=0;
for(int i=1;i<=n;++i){
if(s[i].o==1){
if(s[lst].x==s[i].x)link(s[lst].i,s[i].i),link(s[i].i,s[lst].i);
lst=i;
}else if(s[lst].x==s[i].x)link(s[lst].i,s[i].i);
}
std::sort(s+1,s+n+1,cmp2);
lst=0;
for(int i=1;i<=n;++i){
if(s[i].o==2){
if(s[lst].y==s[i].y)link(s[lst].i,s[i].i),link(s[i].i,s[lst].i);
lst=i;
}else if(s[lst].y==s[i].y)link(s[lst].i,s[i].i);
}
for(int i=1;i<=n;++i)
if(s[i].o==3)
for(int j=0;j<8;++j){
std::pair<int,int>a=std::make_pair(s[i].x+dX[j],s[i].y+dY[j]);
if(M.find(a)!=M.end())link(s[i].i,M[a]);
}
for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
int ans=0;
for(int i=1;i<=scc[0];++i)ans=std::max(ans,dp(i));
printf("%d\n",ans);
return 0;
}

洛咕 P2403 [SDOI2010]所驼门王的宝藏的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Falsk的模板分配和蓝图、定制错误信息、 和补充

    Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...

  2. [翻译] IDMPhotoBrowser

    IDMPhotoBrowser IDMPhotoBrowser is a new implementation based on MWPhotoBrowser. IDMPhotoBrowser实现了图 ...

  3. September 14th 2017 Week 37th Thursday

    Don't let the past steal your present. 别让过去悄悄偷走了我们的当下. We take what we can get and make the best of ...

  4. MongoDB 多实例安装成服务

    转发自:https://www.cnblogs.com/GainLoss/p/6906937.html 1.在mongodb的官网上下载安装包 https://www.mongodb.com/down ...

  5. VRSProcess(一)

    1.freopen( "CONOUT$","w",stdout);在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”. ...

  6. iOS网络缓存的系统实现是一个烂尾工程

    烂尾的原因是request的一致性比较接口没有开放出来.

  7. javascript中对数组对象的深度拷贝

    在前端开发的某些逻辑中,经常需要对现有的js对象创建副本,避免污染原始数据的情况. 如果是简单的一维数组对象,可以使用两个原生方法: 1.splice var arr1 = ['a', 'b', 'c ...

  8. shell基础--shell特殊变量

    一.变量列表 二.实验 系统:centos 7 1.特殊变量 [root@~_~ day2]# cat p.sh #!/bin/bashecho '$0:'$0echo '$*:'$*echo '$@ ...

  9. JavaScript 空位补零实现代码

    实现一: 复制代码代码如下: /* 平淡无奇法 */ function pad(num, n) { var i = (num + "").length; while(i++ < ...

  10. C#根据淘宝接口网址获取客户端访问IP和网络运营商

    网络运营商会为每台联网的电脑分配公网IP,如何获取它们?? 话不多说直接上代码: using System; using System.Collections.Generic; using Syste ...