题目传送门

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

首先这是一道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. IntelliJ IDEA 运行你的第一个Java应用程序

    IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ...

  2. 郝斌 SqlServer2005 学习笔记

    1.0 什么是数据库 狭义:存储数据的仓库. 广义:可以对数据进行存储和管理的软件以及数据本身统称为数据库. 另外一种说法:数据库是由表.关系.操作组成. 2.0 为什么要学习数据库 几乎所有的应用软 ...

  3. chromedriver链接

    http://npm.taobao.org/mirrors/chromedriver/

  4. 自动下单tomcat版本问题

    \xalan\xalan,jar找不到是因为spring boot 中使用的是tomcat8.5,从platform依赖进来的运行时环境是tomcat8,导致覆盖原来的依赖,在platform中移除S ...

  5. Impala 加载Hive的UDF

    Impala的UDF有两种: Native Imapal UDF:使用C++开发的,性能极高,官方性能测试比第二种高出将近10倍 Hive的UDF:是Hive中的UDF,直接加载到Impala中,优点 ...

  6. 高老大 ‘SQL Server 优化器特性导致的内存授予相关BUG’ 学习笔记

    今天高老大出了好文章.在这里 自己本来对这一块比较混乱,正好借这个机会学习一下. 就用高老大的脚本.需要的直接去他那里找吧,这里就省了. 加查询优化标记前后对比 可以看到GrantedMemory是5 ...

  7. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca

    今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...

  8. Knowledge Point 20180308 Dead Code

    不知道有没有前辈注意过,当你编写一段“废话式的代码时”会给出一个Dead Code警告,点击警告,那么你所写的废物代码会被编译器消除,那么如果你不理睬这个警告呢?编译后会是什么样的呢?下面我们写点代码 ...

  9. AppleDoc

    使用AppleDoc快速生成iOS开发文档 _ 皮卡丘♪-(´ε` ) 用 appledoc 生成文档 _ Garan no dou xcode-select_ error_ tool 'xcodeb ...

  10. SQLMAP注入常见用法

    1.检查注入点 sqlmap -u http://www.com.tw/star_photo.php?artist_id=11 2.列数据库信息当前用户和数据库 sqlmap -u http://ww ...