题目链接

  想到缩点后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. BZOJ 1229: [USACO2008 Nov]toy 玩具

    BZOJ 1229: [USACO2008 Nov]toy 玩具 标签(空格分隔): OI-BZOJ OI-三分 OI-双端队列 OI-贪心 Time Limit: 10 Sec Memory Lim ...

  2. vue组件-使用插槽分发内容(slot)

    slot--使用插槽分发内容(位置.槽口:作用: 占个位置) 官网API: https://cn.vuejs.org/v2/guide/components.html#使用插槽分发内容 使用组件时,有 ...

  3. java算法面试题:有数组a[n],用java代码将数组元素顺序颠倒

    package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.List; ...

  4. Express session的使用

    进行session存储时需引用中间件,app.js var express=require('express'); var app=express(); var cookieParser = requ ...

  5. CentOS 7 环境下挂载新磁盘

    最近某个项目需要给数据库服务器添加磁盘,由于太久没搞过,就给虚拟机加了10G的空间,用来练习一下磁盘的挂载 一. 首先执行"fdisk -l"命令,查看磁盘信息 [root@loc ...

  6. Flask初学者:g对象,hook钩子函数

    Flask的g对象 作用:g可以可以看作是单词global的缩写,使用“from flask import g”导入,g对象的作用是保存一些在一次请求中多个地方的都需要用到的数据,这些数据可能在用到的 ...

  7. A1046 Shortest Distance (20)(20 分)

    1046 Shortest Distance (20)(20 分)提问 The task is really simple: given N exits on a highway which form ...

  8. Network of Schools POJ - 1236 (强联通)

    一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...

  9. Android 完美解决bundle实现页面跳转并保留之前数据+传值

    1.前言 前言: 昨天碰到了一个问题,我想实现页面跳转,采用了Bundle之后,再回到原来的页面,发现数据也没有了, 而且一直报错,网上查找了很多资料,发现要用一个startActivityForRe ...

  10. Kali 安装VMtools(最新)

    老方法安装的VMtools不能进行主宿切换,下面是kali最新版安装VMtools的方法 一.换国内源&更新源 参考 Kali 2017更新源 二.安装VMtools apt-get inst ...