Luogu P2403 [SDOI2010]所驼门王的宝藏
比较显然的缩点+拓扑排序题,只不过要建虚点优化建边。
首先我们发现在一个SCC里的点都是可以一起对答案产生贡献的,因此先缩成DAG,然后拓扑找最长链。
但是我们发现这题最坏情况下边数会达到恐怖的\(O(n^2)\),因此我们可以对于每种门进行讨论:
- 横天门:将该点向这个点坐在的格子的横坐标建立虚点并连边
- 纵寰门:将该点向这个点坐在的格子的纵坐标建立虚点并连边
- ZY门:暴力八个方向直接连边即可,(拿map存坐标吧,不会T的)
然后每个点对应横纵坐标的虚点都向这个点连边,这样就可以处理同行/列的情况。
不过这样写Tarjan就要注意常数问题了(点数边数\(10000000+\)),手动卡常松松松
CODE
#include<cstdio>
#include<cctype>
#include<map>
#include<utility>
#include<cstring>
#define mp make_pair
using namespace std;
const int N=100005,R=1000005;
const int fx[8]={0,1,0,-1,1,1,-1,-1},fy[8]={1,0,-1,0,1,-1,1,-1};
map <pair<int,int>,int> h;
int n,r,c,cnt,head[N+(R<<1)],nhead[N+(R<<1)],dfn[N+(R<<1)],stack[N+(R<<1)],low[N+(R<<1)],s[N+(R<<1)],tot,scc,top,col[N+(R<<1)],ru[N+(R<<1)],d[N+(R<<1)],q[N+(R<<1)];
bool vis[N+(R<<1)];
struct data
{
int x,y,opt;
}a[N];
struct edge
{
int to,next;
}e[N<<3],ne[N<<3];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline void nadd(int x,int y)
{
ne[++cnt].to=y; ne[cnt].next=nhead[x]; nhead[x]=cnt;
}
inline void build(int x,int y,int id)
{
for (register int i=0;i<8;++i)
{
int xx=x+fx[i],yy=y+fy[i];
if (xx>0&&xx<=r&&yy>0&&yy<=c&&h[mp(xx,yy)]) add(id,h[mp(xx,yy)]);
}
}
inline void miner(int &x,int y)
{
if (y<x) x=y;
}
inline void maxer(int &x,int y)
{
if (y>x) x=y;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
for (register int i=head[now];~i;i=e[i].next)
if (!dfn[e[i].to]) Tarjan(e[i].to),miner(low[now],low[e[i].to]);
else if (vis[e[i].to]) miner(low[now],dfn[e[i].to]);
if (dfn[now]==low[now])
{
col[now]=++scc; vis[now]=0; s[scc]=(now<=n);
while (stack[top]!=now)
col[stack[top]]=scc,vis[stack[top]]=0,s[scc]+=(stack[top--]<=n); --top;
}
}
inline int top_sort(void)
{
register int i,H=0,T=0; int ans=0;
for (i=1;i<=scc;++i) if (!ru[i]) q[++T]=i,d[i]=s[i];
while (H<T)
{
int now=q[++H]; maxer(ans,d[now]);
for (i=nhead[now];~i;i=ne[i].next)
{
maxer(d[ne[i].to],d[now]+s[ne[i].to]);
if (!(--ru[ne[i].to])) q[++T]=ne[i].to;
}
}
return ans;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; read(n); read(r); read(c);
memset(head,-1,sizeof(head)); memset(nhead,-1,sizeof(nhead));
for (i=1;i<=n;++i)
{
read(a[i].x); read(a[i].y); read(a[i].opt);
switch (a[i].opt)
{
case 1:add(i,n+a[i].x);break;
case 2:add(i,n+r+a[i].y);break;
}
add(n+a[i].x,i); add(n+r+a[i].y,i); h[mp(a[i].x,a[i].y)]=i;
}
for (i=1;i<=n;++i) if (a[i].opt==3) build(a[i].x,a[i].y,i);
for (i=1;i<=n+r+c;++i) if (!dfn[i]) Tarjan(i);
for (cnt=0,i=1;i<=n+r+c;++i)
for (j=head[i];~j;j=e[j].next)
if (col[i]!=col[e[j].to]) nadd(col[e[j].to],col[i]),++ru[col[i]];
return printf("%d",top_sort()),0;
}
Luogu P2403 [SDOI2010]所驼门王的宝藏的更多相关文章
- 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 ...
- [bzoj1924]P2403 [SDOI2010]所驼门王的宝藏
tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times ...
- 洛咕 P2403 [SDOI2010]所驼门王的宝藏
简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...
- 洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解
题目描述 分析 先放一张图便于理解 这一道题如果暴力建图会被卡成\(n^{2}\) 实际上,在我们暴力建图的时候,有很多边都是重复的 假如一行当中有许多横天门的话,我们就不必要把这一行当中的所有点和每 ...
- Luogu 2403 [SDOI2010]所驼门王的宝藏
BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...
- [SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- [LuoguP2403][SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
随机推荐
- VM虚拟机打不开,没有反应,解决方法。
最近的项目开发,需要用到虚拟机,但是打开虚拟机VM8却发现,以前创建的虚拟机都用不了,点击左侧[我的计算机]中的虚拟机列表,没有任何反应,也没有任何错误提示,服务中所有的虚拟机服务都开启了,网上百度没 ...
- 【PAT】B1064 朋友数(20 分)
以前写的,逻辑不好,过后再改 #include<stdio.h> #include<algorithm> #include<math.h> using namesp ...
- shell脚本之数组
变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间. 数组名:整个数组只有一个名字: 数组索引:编号从0开始: 数组名[索引]: 引用数组中的某个元素:${ ARRAY_NAME [ ...
- Hive-1.2.1_04_DML操作
Hive官方文档:Home-UserDocumentation Hive DML官方文档:LanguageManual DML 参考文章:Hive 用户指南 1. Loading files into ...
- Python实现Excel转换工具小结
经历过的打表工具从c++.C#,再到Python,算下来还是Python方便些.一天即可上手开发,非常适合快速迭代中的各种小工具开发. Python开源的第三方库很多,涉及excel方面的也有好几个x ...
- Lua与C交互之基础操作(1)
@(语言) Lua是一个嵌入式的语言,可以Lua可以作为程序库用来扩展应用的功能,也可以注册有其他语言实现的函数,这些函数可能由C语言(或其他语言)实现,可以增加一些不容易由Lua实现的功能.这就是L ...
- Linux 下安装 Tomcat 出现拒绝访问的情况
此外也无法调用 java -version 查看版本号 ./shutdown 时:提示找不到 JDK 的某个文件夹 ./startup 时:却启动正常 访问 8080 端口时,显示拒绝访问 解决方法: ...
- python2.7.15 + PyQt4部署
安装python模块首先想到的就是 https://pypi.org/,但在上面下载的PyQt4的包却找不到安装的方法,于是找找试其它方法,下面介绍通过pip安装whl的安装方式 1.先打开 http ...
- Java面试题以及答案精选(架构师面试题)-基础题1
基础题 一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?1. String是字符串常量,StringBuffer和StringBu ...
- FusionCharts参数说明——3D饼图属性(Pie3D.swf )
animation 是否显示加载图表时的动画palette 内置的图表样式,共5个paletteColors 自定义图表元素颜色(为多个,如过过少会重复)showAboutMenuItem 右键是否显 ...