题目链接

  想到缩点后DP这题就迷之好做

  横天门就点向该行连一条边

  纵门就点向该列连一条边

  ziyou门直接枚举……map搞搞……话说ziyou门为啥是违规内容不让我发布?

  然后缩点,DP,1A

  不过写得迷之心累……想装死……

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#include<map>
#define maxn 2200010
#define maxd 100020
#define base r+c
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int dfn[maxn],cnt;
int stack[maxn],top;
int col[maxn],ID;
bool vis[maxn];
int low[maxn];
int size[maxn],sum[maxn];
bool ext[maxn];
int n,r,c; int ans; struct Pic{
struct Edge{
int next,to;
}edge[maxn*];
int head[maxn],num;
Pic(){memset(head,,sizeof(head));}
inline void add(int from,int to){
edge[++num]=(Edge){head[from],to};
head[from]=num;
}
void tarjan(int x){
//printf("%d\n",x);
dfn[x]=low[x]=++cnt;
vis[x]=; stack[++top]=x;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(dfn[to]==){
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if(vis[to]) low[x]=min(low[x],dfn[to]);
}
if(low[x]==dfn[x]){
col[x]=++ID; vis[x]=;
if(x>base) size[ID]++;
while(stack[top]!=x){
col[stack[top]]=ID;
vis[stack[top]]=;
if(stack[top]>base) size[ID]++;
top--;
}
top--;
}
}
void dfs(int x){
vis[x]=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]){
sum[x]=max(sum[x],sum[to]);
continue;
}
dfs(to);
sum[x]=max(sum[x],sum[to]);
}
sum[x]+=size[x];
ans=max(ans,sum[x]);
return;
}
}Old,New; map<long long,int>d; inline long long calc(long long i,long long j){ return (i-)*c+j+base; } struct Node{
int x,y,id,opt;
}q[maxd]; int u[]={,-,-,,,,,,-};
int w[]={,,,,,,-,-,-}; int main(){
n=read(),r=read(),c=read();
for(int i=;i<=n;++i){
int x=read(),y=read(),opt=read();
long long now=calc(x,y);
ext[x]=ext[y+r]=ext[i+base]=;
Old.add(x,i+base);
Old.add(y+r,i+base);
q[i]=(Node){x,y,i+base,opt};
d[now]=i+base;
}
for(int i=;i<=n;++i){
int opt=q[i].opt;
if(opt==) Old.add(q[i].id,q[i].x);
else if(opt==) Old.add(q[i].id,q[i].y+r);
else{
for(int j=;j<;++j){
int x=q[i].x+u[j],y=q[i].y+w[j];
if(x<||x>r||y<||y>c) continue;
if(d.count(calc(x,y))) Old.add(q[i].id,d[calc(x,y)]);
}
}
}
for(int i=;i<=n+base;++i)
if(ext[i]&&dfn[i]==) Old.tarjan(i);
for(int i=;i<=n+base;++i)
for(int j=Old.head[i];j;j=Old.edge[j].next){
int to=Old.edge[j].to;
if(col[i]==col[to]) continue;
New.add(col[i],col[to]);
}
for(int i=;i<=ID;++i)
if(vis[i]==) New.dfs(i);
printf("%d\n",ans);
return ;
}

【Luogu】P2403所驼门王的宝藏(强连通分量)的更多相关文章

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

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

  2. BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)

    思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链. 问题在于暴力建图是O(n^2)的, ...

  3. BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. hdu-1856 More is better---带权并查集

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1856 题目大意: 一个并查集 计算每个集合的元素 找出元素最多的那个集合,输出元素的个数 解题思路: ...

  2. python_40_通过脚本转换参数实现替换

    import sys f=open('yesterday','r',encoding='utf-8') f_new=open('yesterday_update','w',encoding='utf- ...

  3. 文件系统 - Linux 支持的文件系统类型

    NAME 文件系统 - Linux 支持的文件系统类型:minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sy ...

  4. Angular6中[ngClass]、[ngStyle]的基本使用

    1.ngStyle 基本用法 <div [ngStyle]="{'background-color':'green'}"></<div> 判断添加 & ...

  5. CSS 样式、布局、盒子模型

    Css内容: 常用样式: 字体    颜色   背景 布局: 浮动   定位   标签特性 标签盒子模型:  边距   边框 动画: 旋转 渐变 注意:Css引路径从css文件里找   Html和js ...

  6. Oracle数据库学习(一)

    Oracle数据库由甲骨文公司开发,是基于对象的关系型数据库:下面是简单的学习数据库操作等知识. 1.SQL单表查询(设一个表名为tab) (1)查询所有记录 select * from tab(一般 ...

  7. Maven和Gradle对比(转载)

    转载出处:http://www.cnblogs.com/huang0925 Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山 ...

  8. String&StringBuffer&StringBuilder区别

    String  String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式:    (1)直接赋值(例中,String str = &q ...

  9. file_get_contents函数

    今天迁移一个SDK项目到新的机子上,发现项目无法跑起来,报500错误,通过分析,发现原来是file_get_contents函数再作怪,代码如下 public function __construct ...

  10. 删除Zend Studio项目

    导入了过大的项目,导致很卡,且Close Project和Delete操作不了,一直无响应. 调整项目目录下的隐藏文件夹,删除对应项目: E:\www\.metadata\.plugins\org.e ...