【SDOI2010】【BZOJ1924】所驼门王的宝藏
Description
Input
第一行给出三个正整数 N, R, C。 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti。Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“自由门”。 保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。
Output
只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。
Sample Input
10 7 7
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1
Sample Output
9
HINT
测试点编号 N R C 1 16 20 20 2 300 1,000 1,000 3 500 100,000 100,000 4 2,500 5,000 5,000 5 50,000 5,000 5,000 6 50,000 1,000,000 1,000,000 7 80,000 1,000,000 1,000,000 8 100,000 1,000,000 1,000,000 9 100,000 1,000,000 1,000,000 10 100,000 1,000,000 1,000,000
Source
压强联通分量然后缩点
然后DAG上SPFA求个最长路
跑的又慢内存又大系列…因为一开始给缩点前的图开小内存了一直REQAQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 110000
using namespace std;
int n,r,c,ans;
void in(int &x)
{char ch=getchar();x=0;while (!(ch>='0'&&ch<='9')) ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
struct node
{int x,y,opt;
}s[MAXN];
struct edge
{int to,w;edge *next;
};
struct Map1
{int top;edge e[MAXN*50];edge *prev[MAXN];Map1(){top=0;memset(e,0,sizeof(e));memset(prev,0,sizeof(prev));}void insert(int u,int v,int w){if (u==v) return;e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].w=w;}
}m1;
struct Map2
{int top;edge e[MAXN*10];edge *prev[MAXN];Map2(){top=0;memset(e,0,sizeof(e));memset(prev,0,sizeof(prev));}void insert(int u,int v,int w){if (u==v) return;e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].w=w;}
}m2;
int raw[MAXN*10],pre_raw[MAXN*10],col[MAXN*10],pre_col[MAXN*10];
bool vis[MAXN];
int dis[MAXN],In[MAXN],Out[MAXN],sum[MAXN];
int dfn[MAXN],stack[MAXN],low[MAXN],ind,scc,block[MAXN];
void dfs(int x)
{vis[x]=1;stack[++stack[0]]=x;low[x]=dfn[x]=++ind;for (edge *i=m1.prev[x];i;i=i->next)if (block[i->to]==0){if (!vis[i->to]) dfs(i->to);low[x]=min(low[x],low[i->to]);}if (low[x]==dfn[x]){scc++;while (stack[stack[0]+1]!=x) block[stack[stack[0]--]]=scc;}
}
void SPFA()//最长路
{memset(vis,0,sizeof(vis));queue<int> que;for (int i=1;i<=scc;i++){dis[i]=-1;if (In[i]==0) que.push(i),vis[i]=1,dis[i]=0;}while (!que.empty()){int x=que.front();que.pop();for (edge *i=m2.prev[x];i;i=i->next)if (dis[x]+i->w>dis[i->to]){dis[i->to]=dis[x]+i->w;if (!vis[i->to]){vis[i->to]=1;que.push(i->to);}}vis[x]=0;}for (int i=1;i<=scc;i++)if (!Out[i]) dis[i]+=sum[i];for (int i=1;i<=scc;i++) ans=max(ans,dis[i]);
}
int main()
{in(n);in(r);in(c);for (int i=1;i<=n;i++)//一开始的图 {in(s[i].x);in(s[i].y);in(s[i].opt);raw[i]=pre_raw[s[i].x];pre_raw[s[i].x]=i;col[i]=pre_col[s[i].y];pre_col[s[i].y]=i;}for (int i=1;i<=n;i++){if (s[i].opt==1)for (int x=pre_raw[s[i].x];x;x=raw[x]) m1.insert(i,x,0);elseif (s[i].opt==2)for (int x=pre_col[s[i].y];x;x=col[x]) m1.insert(i,x,0); elseif (s[i].opt==3){for (int x=pre_raw[s[i].x+1];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);for (int x=pre_raw[s[i].x];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);for (int x=pre_raw[s[i].x-1];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);}}for (int i=1;i<=n;i++)//缩点 if (block[i]==0) dfs(i);for (int i=1;i<=n;i++) sum[block[i]]++;for (int j=1;j<=n;j++)//重构图 for (edge *i=m1.prev[j];i;i=i->next)if (block[i->to]!=block[j]) m2.insert(block[j],block[i->to],sum[block[j]]),In[block[i->to]]++,Out[block[j]]++;SPFA();printf("%d\n",ans);
}
【SDOI2010】【BZOJ1924】所驼门王的宝藏相关推荐
- 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- BZOJ1924: [Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 1303 Solved: 582 [Submit][S ...
- P2403 [SDOI2010]所驼门王的宝藏
P2403 [SDOI2010]所驼门王的宝藏 题意: R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传 ...
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- 洛谷P2403 [SDOI2010]所驼门王的宝藏
Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的 Alpaca L. Sotomon 是这个家族的领袖,外人也称其为"所驼 ...
- [SDOI2010] 所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- 洛谷 2403 [SDOI2010] 所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)
文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...
- 洛咕 P2403 [SDOI2010]所驼门王的宝藏
简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...
最新文章
- oracle事务数统计,oracle函数与事务
- BYTE,WORD,DWORD的大小及一些特殊的高低位宏(取高位 取低位)
- pytorch问题汇总
- Wisdom RESTClient支持自动化测试并可以生成API文档
- SQL server 2005中无法新建作用(Job)的问题
- 新一代大数据处理引擎 Apache Flink
- background图片不显示_一种解决Retina屏幕1px边框显示问题的方案
- vue 编辑弹框,编辑页面,列表数据也会跟着变
- Vmware下安装CentOS6的特别注意,一定要在虚拟机上电时候按DEL,选择操作系统启动方式...
- iOS设计模式——委托(delegate)
- Python内存优化,节省内存字典ConstDict
- ARP协议及局域网断网攻击(scapy)
- SQL Server建库建表命令
- 【安全知识分享】PPTX|新安全生产法解读(66页)(附下载)
- android apk sign,apk文件的sign以及align命令
- Nodejs中使用ioredis库
- c语言程序设计(西安理工大学),C语言程序设计-西安理工大学三电实验教学中心!.doc...
- LC117 Populating Next Right Pointers in Each Node II
- TwinCAT更改背景主题颜色
- 人工智能发展的三起两落