Description

在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族。被族人恭称为“先知”的 Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”。所驼门王毕生致力于维护家族的安定与和谐,他曾亲自率军粉碎河蟹帝国主义的野蛮侵略,为族人立下赫赫战功。所驼门王一生财宝无数,但因其生性节俭低调, 他将财宝埋藏在自己设计的地下宫殿里,这也是今天 Henry Curtis 故事的起点。Henry 是一个爱财如命的贪婪家伙,而又非常聪明,他费尽心机谋划了这次盗窃行动,破解重重机关后来到这座地下宫殿前。

==============================================================

整座宫殿呈矩阵状,由 R×C 间矩形宫室组成,其中有 N 间宫室里埋藏着宝藏,称作藏宝宫室。宫殿里外、相邻宫室间都由坚硬的实体墙阻隔,由一间宫室到达另一间只能通过所驼门王独创的移动方式——传送门。所驼门王为这 N 间藏宝宫室每间都架设了一扇传送门,没有宝藏的宫室不设传送门,所有的宫室传送门分为三种:

1、“横天门”:由该门可以传送到同行的任一宫室;

2、“纵寰门”:由该门可以传送到同列的任一宫室;

3、“自由门”:由该门可以传送到以该门所在宫室为中心周围8格中任一宫室(如果目标宫室存在的话)。

深谋远虑的 Henry 当然事先就搞到了所驼门王当年的宫殿招标册,书册上详细记录了每扇传送门所属宫室及类型。而且,虽然宫殿内外相隔,但他自行准备了一种便携式传送门,可将自己传送到殿内任意一间宫室开始寻宝,并在任意一间宫室结束后传送出宫。整座宫殿只许进出一次,且便携门无法进行宫室之间的传送。不过好在宫室内传送门的使用没有次数限制,每间宫室也可以多次出入。

现在 Henry 已经打开了便携门,即将选择一间宫室进入。为得到尽多宝藏, 他希望安排一条路线,使走过的不同藏宝宫室尽可能多。请你告诉 Henry 这条路 线最多行经不同藏宝宫室的数目。


Input

第一行给出三个正整数 N, R, C。

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

Ti 是一个 1~3 间的整数,

1 表示可以传送到第 xi 行任意一列的“横天门”,

2 表示可以传送到任意一行第 yi 列的“纵寰门”,

3 表示可以传送到周围 8 格宫室的“自由门”。

保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。


Output

只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。


Solution

思路简单 有点卡常

横天门连同行的所有宫室,纵寰门同理。
自由门用map判断相邻8个是否存在。
反而无脑建图能过

缩点成DAG然后乱搞求最长路

建议dijkstra或spfa加优化


Code

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
int d[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
map<int,int>mp;
struct edge{int y,nxt;
}e[4000010],g[4000010];
struct data{int x,y,z;
}a[100010];
int head1[100010],cnt1;
int head[100010],cnt;
int dfn[100010],idx;
int val[100010],tot;
int low[100010];
int stk[100010],tp;
int bl[100010];
vector<int>vr[100010],vc[100010];
int n,r,c,ans;
void add(int x,int y){cnt++;e[cnt].y=y;e[cnt].nxt=head[x];head[x]=cnt;//cout<<x<<" "<<y<<endl;
}
void add1(int x,int y){cnt1++;g[cnt1].y=y;g[cnt1].nxt=head1[x];head1[x]=cnt1;
}
void tarjan(int x){stk[++tp]=x;dfn[x]=low[x]=++idx;for(int i=head[x];i;i=e[i].nxt){int y=e[i].y;if(bl[y]) continue;if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else low[x]=min(low[x],dfn[y]);}if(low[x]==dfn[x]){tot++;int y;do{y=stk[tp];bl[y]=tot;val[tot]++;tp--;}while(x!=y);}
}
int dp[100010];
int in[100010];
struct qe{int x,s;bool operator <(const qe& v)const{return s<v.s;}
};
priority_queue<qe>q;
void dijkstra(){for(int i=1;i<=tot;i++)if(!in[i]) q.push((qe){i,dp[i]=val[i]});//,cout<<i<<" "<<val[i]<<endl;while(!q.empty()){qe u=q.top(); q.pop();for(int i=head1[u.x];i;i=g[i].nxt){int y=g[i].y;if(dp[y]<dp[u.x]+val[y]){dp[y]=dp[u.x]+val[y];q.push((qe){y,dp[y]});}}} for(int i=1;i<=tot;i++)ans=max(ans,dp[i]);//,cout<<i<<" "<<val[i]<<" "<<dp[i]<<endl;;//cout<<x<<" "<<val[x]<<" "<<dp[x] <<endl;
}
inline int read(){int re=0,flag=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') flag=-1;ch=getchar();}while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();return re*flag;
}
int main(){//freopen("fuc.txt","w",stdout);n=read(),r=read(),c=read();for(int i=1;i<=n;i++){a[i].x=read(),a[i].y=read(),a[i].z=read();mp[a[i].x*(n-1)+a[i].y]=i; vr[a[i].x].push_back(i);vc[a[i].y].push_back(i);}for(int i=1;i<=n;i++){if(a[i].z==1) for(int j=0;j<vr[a[i].x].size();j++)if(vr[a[i].x][j]!=i) add(i,vr[a[i].x][j]);if(a[i].z==2) for(int j=0;j<vc[a[i].y].size();j++)if(vc[a[i].y][j]!=i) add(i,vc[a[i].y][j]);if(a[i].z==3) for(int j=0;j<8;j++){int x=a[i].x+d[j][0];int y=a[i].y+d[j][1];//cout<<a[i].x<<" "<<a[i].y<<" "<<x<<" "<<y<<endl;if(mp[x*(n-1)+y]==0) continue;add(i,mp[x*(n-1)+y]);}}//cout<<endl;mp.clear();for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);//for(int i=1;i<=n;i++)//cout<<i<<" "<<bl[i]<<endl;for(int i=1;i<=n;i++)if(bl[i]) for(int j=head[i];j;j=e[j].nxt)if(mp[bl[i]*(tot-1)+bl[e[j].y]]==0&&bl[i]!=bl[e[j].y]){mp[bl[i]*(tot-1)+bl[e[j].y]]=1;add1(bl[i],bl[e[j].y]);in[bl[e[j].y]]++;//cout<<bl[i]<<" "<<bl[e[j].y]<<endl;}dijkstra();printf("%d",ans);
}

洛谷P2403 [SDOI2010]所驼门王的宝藏相关推荐

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

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

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

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

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

    P2403 [SDOI2010]所驼门王的宝藏 题意: R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传 ...

  4. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

    文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...

  5. BZOJ1924: [Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 1303  Solved: 582 [Submit][S ...

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

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

  7. bzoj 1924: [Sdoi2010]所驼门王的宝藏

    23333这个垃圾题之前扒过题解了2333 然而这一次做又错了... 直接暴力连边,然后缩一下点,重构变成DAG,然后DP.. (然而在打tarjan的时候忘掉了inq[now]=0....而且把DP ...

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

    Description Input Output Sample Input 题解: 水题,但还是打表过的-- 这个题目,我们显然可以对关键点进行加边.我就是因为加边加太多了才MLE的,当然对于1,2这 ...

  9. BZOJ 1924 [Sdoi2010]所驼门王的宝藏 tarjan缩点+拓扑DP

    题意: 一个r*c的图中,有n个宫殿. 每个宫殿有一个类型. 类型1:可以到达他所在的行的任意宫殿. 类型2:可以到达他所在的列的任意宫殿. 类型3:可以到达他四周八个格子的任意宫殿. 现在你从任意一 ...

最新文章

  1. R语言ggplot2可视化:为图像中的均值竖线、中位数竖线、 geom_vline添加图例(legend)
  2. 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
  3. Shell-Scp自动输入密码
  4. 【struts2】文件上传下载—struts2实现
  5. 三台服务器的时间同步-Linux
  6. 非常好用的模糊pid温度控制算法_高度集成高速多点温度PID控制方案
  7. python京东自动下单_京东自动下单脚本
  8. 林期苏曼属性标签编辑_CAD技巧之增强属性编辑器 属性文字
  9. OpenCV—HSV色彩空间基础知识
  10. 招商银行笔试题之X游戏
  11. 虚拟主机终极选购指南
  12. 计算机维修分为那两种,计算机二级维修中最常见的三种方法是什么?
  13. js个人博客设计大作业
  14. 深度学习分类分到同一个类
  15. 自己手动重写的equals方法与自动生成重写的equals方法的区别
  16. 2021年岳阳市一中高考成绩查询,岳阳2021高考最高分多少分,岳阳历年高考状元资料...
  17. python爬虫简易到进阶实战篇——(1)
  18. Linux ALSA 之二:ALSA 声卡与设备
  19. fedora 笔记本安装_漂亮的超薄笔记本电脑,令Fedora焕发光芒
  20. 基于双曝光与数值计算法全息干涉相位畸变补偿实例分析

热门文章

  1. 沪江 AOP 切片 API使用说明
  2. 多变量可视化——QGIS二元分区着色图
  3. Latex绘制多个子图,包括标签、布局、图像大小等
  4. 用于视觉语言导航的自监督三维语义表示学习
  5. svg标记marker
  6. gerrit git 邮箱不匹配的问题
  7. tp3.2使用QQ邮箱或163邮箱通过PHPMailer发送邮件
  8. 关于如何搭建网站并发布上线
  9. 国内最全的通信运营商5G无线频率分布(含移动电信联通广电铁路)
  10. 开源世界 捷报频传