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是这个家族的领袖,外人也称其为"所驼门王". ...
随机推荐
- commons-lang(一)
写在开头的话: 在工作中,经常会要用到一些公用的组件包,比如日期,String这些等,换过几次工作的朋友对这事肯定比较深刻,如果自己有积累的还好,对于没有积累的同学,尤其是规模较小的公司,怕是又要重头 ...
- JQuery获取和设置Select选项的常用方法总结
1.获取select 选中的 text: $("#cusChildTypeId").find("option:selected").text(); $(&q ...
- 命令行参数技巧:__argc,__argv
几个可以使用的全局变量: _CRTIMP extern int __argc; /* count of cmd line args */ _CRTIMP extern char ** __argv; ...
- 10.spring:常用的数据库代码.....(不长使用了解即可)
测试代码: ApplicationContext ctx = new ClassPathXmlApplicationContext("JDBC.xml"); DataSource ...
- log4net快速使用流程
以下内容大部分来自这里,对原作者流子表示感谢 1.Nuget安装,当前版本2.0.8 2.创建log4net.config文件,文件内容如下: <?xml version="1.0&q ...
- C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"
今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...
- Java实现 lower_bound() 和 upper_bound()
Java实现 lower_bound() 和 upper_bound() lower_bound() 函数 lower_bound() 在 [begin, end) 进行二分查找,返回 大于或等于 t ...
- Google 和 Baidu 常用的搜索技巧
Google 常用的搜索技巧 1. 精确搜索:双引号 精确搜索,就是在你要搜索的词上,加上双引号,这个Google搜索引擎,就会完全的匹配你所要的词 2. 站内搜索:site 这是一个比较常用的搜索方 ...
- 如何搭建私人的ghost博客
可参考 http://blog.pandax.me/cjbk/ 此文
- Elasticsearch插件安装
从github获取插件包例如Head git clone git://github.com/mobz/elasticsearch-head.git 在elasticsearch安装目录中创建插件存放目 ...