简单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. [翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]

    USING GIT IN XCODE LOOKING AT HISTORY Xcode provides a Versions editor, which has three different pe ...

  2. UINavigationController便于pop的category

    UINavigationController便于pop的category 效果图: 这个category是为了方便UINavigationController用于跳转到指定的控制器当中,用于跳级,如果 ...

  3. python2.7下同步华为云照片的爬虫程序实现

    1.背景 随着华为手机的销量加大,华为云的捆绑服务使用量也越来越广泛,华为云支持自动同步照片.通讯录.记事本等,用着确实也挺方便的,云服务带来方便的同时,也带来了数据管理风险.华为目前只提供一个www ...

  4. 整体修改VS中C++工程和解决方案命名问题

    目标:将所有basestation相关的修改为PPPStream 首先,复制一份用于修改的解决方案文件夹,然后打开解决方案,如下图,左侧的两个basestation都重新命名为PPPStream. 第 ...

  5. vs环境变量学习

    1. 查看vs环境变量: 在项目设置中的任何路径.目录编辑项目下,右下角有个“宏”,点开即可见所有vs环境变量的当前设置...听说还有其它地方,没看到. 2.上边的“宏”,即是英文的vs环境变量 3. ...

  6. 学习python第五天进制转换

    6.进制之间的转换(重要) 二进制:满二进一 范围:0.1符号:0b例如:0b10...[注意]计算机只能识别二进制数据 八进制:满八进一 范围:0~7符号:0o例如:0o66 十进制:满十进一 范围 ...

  7. 翻新并行程序设计的认知整理版(state of the art parallel)

    近几年,业内对并行和并发积累了丰富的经验.有了较深刻的理解.但之前积累的大量教材,在当今的软硬件体系下.反而都成了负面教材.所以,有必要加强宣传,翻新大家的认知. 首先.天地倒悬,结论先行:当你须要并 ...

  8. 1090. [SCOI2003]字符串折叠【区间DP】

    Description 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S  S 2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S)  SSSS…S(X个S). ...

  9. Windows10中以管理员身份打开命令提示符

    WIN+X+A (要关闭替换) 从任务栏启动 从开始菜单 从资源管理器 连贯即(alt+f+s+a)

  10. virtualbox+vagrant学习-2(command cli)-10-vagrant Port命令

    Port 格式: vagrant port [options] [name|id] 端口命令显示映射到主机端口的客户端口的完整列表 userdeMacBook-Pro:~ user$ vagrant ...