BZOJ1924_所驼门王的宝藏_KEY
这道题苟了我好久,因为链表的内存问题,之后再细讲。
首先这是一道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 ;
}
BZOJ1924_所驼门王的宝藏_KEY的更多相关文章
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)
「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...
- noip模拟5[string·matrix·big·所驼门王的宝藏]
怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...
- [SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- [LuoguP2403][SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
随机推荐
- React Native for Android on Windows 配置开发安装总结
配置开发安装总结(由于当前react-native更新较快,目前是针对2015年11月底时的reacti-native android for windows版本,有些内容可能过时) 官方的安装指导在 ...
- PHP-----CMS
刚刚看到了一篇关于phpcms的文章自己今后比较有帮助,就把它摘了下来. 1.首先下载phpcms v9的集成安装包并安装,这里就不详细说明了. 2.本地调试建议大家使用APMserver,或者wam ...
- PHP数组和字符串相互转换以及判断字符串长度
这里只介绍最常用的方法: $array=explode(separator,$string); $string=implode(glue,$array); explode() 函数用来将字符串打散成数 ...
- mybatis关联集合List&分布查询传递多列值
场景:查询部门的同时,要求查询此部门下的所有用户. 部门(Department) private Integer id; private String departmentName; private ...
- 内存修改之IOS版ce
开源工具,算法全部在内存中完成,速度比bmsq,igg快,直接搜索0也是无压力.使用c++编写,有一定的扩展能力,可以自己扩展value type和comparator. 项目地址: https:// ...
- HTML&CSS笔记001
lesson1 <!DOCTYPE html><html lang="en,zh"><!-- 告诉搜索引擎爬虫,我们的网站是关于什么内容的 --> ...
- 《Linux 学习》01---redis安装, 并使用Redis Desktop Manager 连接
一.环境简介: linux 系统:centos 7.X 二.安装大纲: 1.下载安装包 2.安装 3.统一管理redis 配置文件 4.编辑redis配置文件,设置常用的功能 5.(1)命令启动,连接 ...
- 判断FreeMarker是否为空
转自:https://blog.csdn.net/lwt976647637/article/details/73135933 (1)判断Map数据是否为空 <#ifmaster??&&a ...
- Mysql 几种常见的插入 Insert into,Replace Into,Insert ignore
简要说下三者的区别:insert into 最普遍的插入,如果表中存在主键相同的数据,执行会报错. replace into 如果表中存在主键相同的数据则根据主键修改当前主键的数据,反之则插入(存在就 ...
- ubuntu系统的软件包管理工具
ubuntu系统的软件包管理工具有两种,一种是离线管理,另一种是在线管理 1.离线管理 dpkg工具可以对本地存放的deb安装包进行安装,卸载,查看状态等. dpkg -i app_name_vers ...