题目传送门

这道题苟了我好久,因为链表的内存问题,之后再细讲。

首先这是一道Tarjan+DAG上DP的题目。

有三种门,对于每种门可以和其他门相连。即连边。

使用链表快速查询连边。

建完图后可以进行Tarjan缩点。

然后做一遍DAG上DP就好了。(记搜)

然后因为建图时会有很多条边,而行列最多只有100000个,所以要分开定义。

不然会爆内存。

code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int read()
{
char c;while(c=getchar(),c<''||c>'');
int x=c-'';while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x;
} int N,R,C,x,y,fx,fy,o,a[][]; struct list{
int head[],nxt[],To[],cnt;
list(){memset(head,-,sizeof head);memset(nxt,-,sizeof nxt);} void add(int x,int y){
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
}
}M,NM; struct list2{
int head[],nxt[],To[],cnt;
list2(){memset(head,-,sizeof head);memset(nxt,-,sizeof nxt);} void add(int x,int y){
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
}
}A,B; int DFN[],LOW[],stack[],top,cnt,vis[],fa[];
int otk[],f[],sk[],ans; void tarjan(int now)
{
stack[++top]=now;
DFN[now]=LOW[now]=++cnt;
vis[now]=;
for(int i=M.head[now];i!=-;i=M.nxt[i]){
if(!DFN[M.To[i]])tarjan(M.To[i]),LOW[now]=min(LOW[now],LOW[M.To[i]]);
else if(vis[M.To[i]])LOW[now]=min(LOW[now],DFN[M.To[i]]);
}
if(DFN[now]==LOW[now]){
while(stack[top]!=now)
fa[stack[top]]=now,sk[now]++,vis[stack[top]]=,top--;
fa[stack[top]]=now;
sk[now]++;
vis[stack[top--]]=;
}
return ;
} int dfs(int now)
{
if(vis[now])return f[now];
vis[now]=;
for(int i=NM.head[now];i!=-;i=NM.nxt[i]){
f[now]=max(f[now],dfs(NM.To[i]));
}
f[now]+=sk[now];
ans=max(ans,f[now]);
return f[now];
} int main()
{
N=read(),R=read(),C=read();
register int i,j,k;
for(i=;i<=N;i++){
a[i][]=read(),a[i][]=read(),a[i][]=read();
A.add(a[i][],i);B.add(a[i][],i);
}
for(i=;i<=N;i++){
x=a[i][],y=a[i][],o=a[i][];
if(o==)
for(j=A.head[x];j!=-;j=A.nxt[j])
if(A.To[j]!=i)M.add(i,A.To[j]);
if(o==)
for(j=B.head[y];j!=-;j=B.nxt[j])
if(B.To[j]!=i)M.add(i,B.To[j]);
if(o==){
for(k=-;k<;k++)
for(j=A.head[x+k];j!=-;j=A.nxt[j]){
fx=a[A.To[j]][],fy=a[A.To[j]][];
if(fx<=x+&&fx>=x-&&fy<=y+&&fy>=y-&&A.To[j]!=i)
M.add(i,A.To[j]);
}
}
}
for(i=;i<=N;i++)if(!DFN[i])tarjan(i);
memset(vis,,sizeof vis);
for(i=;i<=N;i++){
if(!vis[i]){vis[i]=;
for(j=M.head[i];j!=-;j=M.nxt[j]){
if(fa[M.To[j]]!=fa[i])
otk[fa[M.To[j]]]++;
}
}
}
for(i=;i<=N;i++)
for(j=M.head[i];j!=-;j=M.nxt[j])
if(fa[i]!=fa[M.To[j]])NM.add(fa[i],fa[M.To[j]]);
memset(vis,,sizeof vis);
for(i=;i<=N;i++)
if(!otk[fa[i]]&&!vis[fa[i]])
dfs(i);
printf("%d",ans);
return ;
}

Vector版传送门

BZOJ1924_所驼门王的宝藏_KEY的更多相关文章

  1. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

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

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

  3. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  4. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏

    T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...

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

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

  6. noip模拟5[string·matrix·big·所驼门王的宝藏]

    怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...

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

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

  8. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)

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

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

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

随机推荐

  1. NET平台微服务

    .NET平台微服务项目汇集   最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的.. ...

  2. oracle 日期常用函數sysdate

    SYSDATE   2 --◎ 可得到目前系統的時間     3           4   ex.      5     select sysdate from dual;   6          ...

  3. Python取出SQL表单中的字段名

    def ReturnInfo(self, avalue, akey): cursor = connection.cursor() Sql = "select * from %s where ...

  4. 八.安装Nginx

    http://blog.csdn.net/grhlove123/article/details/47834673

  5. 使用 Open Live Writer 创建我的第一个博文

    希望能在此记录我的技术开发过程. 请记住我的博客首页为:https://www.cnblogs.com/unrulife/ 期待在博客园遇到志同道合的朋友! 希望在博客园开启技术生涯的新篇章!

  6. xampp安装及使用时的问题总结

    本文主要介绍易错点,具体安装过程可参考链接1 1.首先要以管理员身份运行,否则报错. 2.如果你的网站首页名字不是index,那么你在访问的时候就必须输入你首页的全称. 3.htdocs就是网站的根目 ...

  7. XXE攻防——XML外部实体注入

    XXE攻防——XML外部实体注入 转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的 ...

  8. VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示

    VC++ 创建基于MFC的SDI应用程序,Visual Studio风格的主界面如下图所示,在该主界面上的视图菜单下包含有队对各个可停靠窗格显示或隐藏的控制菜单项.而基于Ribbon风格的应用程序,所 ...

  9. 点击HTML页面问号出现提示框

    本demo的功能:点击页面按钮在其边缘出现提示信息,点击页面任何一处则消失. 如下图: 1.所需插件: jquery插件: layer插件: 2.HTML内容: ==注意==: class=" ...

  10. vue 方法相互调用注意事项与详解

    vue在同一个组件内: methods中的一个方法调用methods中的另外一个方法: 可以直接这样调用:this.$options.methods.test(); this.$options.met ...