【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
http://www.lydsy.com/JudgeOnline/problem.php?id=2541
https://vijos.org/p/1366
loli秘制大爆搜_(:з」∠)_坑了好久啊QAQ一上午花了2h+写这道题,最后WA了2个点,调了一下午多。
在矩形一条边上的所有位置都是等效的,所以把每个矩形的四条边拆开,表示为点。每个点只会连出去一条边,暴力找边建图,最后跑堆优dij。
时间复杂度\(O(n^2)\)(附带大常数16一脸不可过?不过最后竟然过了)
一开始认为有环爆搜不可做,便建图跑了最短路。后来xyx0711跟我说直接bfs不走环,因为正确的路不会走环,后来想想也是。。。但是懒得改了。
恶心经历:冰块一次推进洞真心没想到,改完之后还WA第8个点,后来发现判断和T的连边时少写了一个条件,快速写上过了那个点,再评测发现第一个点突然又WA了,查了好久发现因为之前写得太急把坐标打反了(坐标打反了都能放过我9个点,这数据。。。)
改第8个点改了一下午TWT,自己画了一下原图,还手动模拟出了正确答案QAQ
起点是最左上角的点,终点是最靠右边的点,这个是离散过坐标轴后画出来的图
真心代码题
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int in() {
int k = 0, fh = 1; char c = getchar();
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for (; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - 48;
return k * fh;
}
const int N = 4003;
const int jie[4][2] = {3, 1, 2, 0, 3, 1, 2, 0};
int n, xs, xt, ys, yt, xa[N], ya[N], xb[N], yb[N], num[N][4], to[N][4][2], tot = 0, l, r, up, tt[4];
struct node {int nxt, to;} E[N * 4 * 2 + 100];
int cnt = 0, point[N * 4], dist[N * 4], S, T;
bool inq[N * 4];
void ins(int u, int v) {E[++cnt] = (node) {point[u], v}; point[u] = cnt;}
struct Qnode {
int id, dist;
Qnode (int _id = 0, int _dist = 0) : id(_id), dist(_dist) {}
bool operator < (const Qnode &A) const {
return dist > A.dist;
}
};
priority_queue <Qnode> Q;
int main() {
n = in(); xs = in(); ys = in(); xt = in(); yt = in();
for (int i = 1; i <= n; ++i) {
xa[i] = in();
ya[i] = in();
xb[i] = in();
yb[i] = in();
for (int j = 0; j < 4; ++j)
num[i][j] = ++tot;
}
if (xs == xt) {
l = ys; r = yt;
if (l > r) swap(l, r);
up = 0;
for (int i = 1; i <= n; ++i)
if (yb[i] < l || ya[i] > r || xa[i] > xs || xb[i] < xs)
++up;
if (up == n) {puts("1"); return 0;}
}
if (ys == yt) {
l = xs; r = xt;
if (l > r) swap(l, r);
up = 0;
for (int i = 1; i <= n; ++i)
if (yb[i] < ys || ya[i] > ys || xa[i] > r || xb[i] < l)
++up;
if (up == n) {puts("1"); return 0;}
}
for (int i = 1; i <= n; ++i) {
l = ya[i]; r = yb[i]; up = xa[i];
for (int j = 1; j <= n; ++j)
if (xb[j] < up) {
if (l <= ya[j] - 1 && ya[j] - 1 <= r) {
if ((to[j][1][1] == 0) || (xa[to[j][1][1]] > up))
to[j][1][1] = i;
}
if (l <= yb[j] + 1 && yb[j] + 1 <= r) {
if ((to[j][3][1] == 0) || (xa[to[j][3][1]] > up))
to[j][3][1] = i;
}
}
l = xa[i]; r = xb[i]; up = ya[i];
for (int j = 1; j <= n; ++j)
if (yb[j] < up) {
if (l <= xa[j] - 1 && xa[j] - 1 <= r) {
if ((to[j][0][1] == 0) || (ya[to[j][0][1]] > up))
to[j][0][1] = i;
}
if (l <= xb[j] + 1 && xb[j] + 1 <= r) {
if ((to[j][2][1] == 0) || (ya[to[j][2][1]] > up))
to[j][2][1] = i;
}
}
l = ya[i]; r = yb[i]; up = xb[i];
for (int j = 1; j <= n; ++j)
if (xa[j] > up) {
if (l <= ya[j] - 1 && ya[j] - 1 <= r) {
if ((to[j][1][0] == 0) || (xb[to[j][1][0]] < up))
to[j][1][0] = i;
}
if (l <= yb[j] + 1 && yb[j] + 1 <= r) {
if ((to[j][3][0] == 0) || (xb[to[j][3][0]] < up))
to[j][3][0] = i;
}
}
l = xa[i]; r = xb[i]; up = yb[i];
for (int j = 1; j <= n; ++j)
if (ya[j] > up) {
if (l <= xa[j] - 1 && xa[j] - 1 <= r) {
if ((to[j][0][0] == 0) || (yb[to[j][0][0]] < up))
to[j][0][0] = i;
}
if (l <= xb[j] + 1 && xb[j] + 1 <= r) {
if ((to[j][2][0] == 0) || (yb[to[j][2][0]] < up))
to[j][2][0] = i;
}
}
}
for (int i = 1; i <= n; ++i)
for (int j = 0; j < 4; ++j)
for (int k = 0; k < 2; ++k)
if (to[i][j][k])
ins(num[i][j], num[to[i][j][k]][jie[j][k]]);
S = ++tot; T = ++tot;
int x = xs, y = ys;
for (int i = 1; i <= n; ++i) {
if (xa[i] > x && ya[i] <= y && y <= yb[i]) {
if ((tt[0] == 0) || (xa[i] < xa[tt[0]]))
tt[0] = i;
}
if (ya[i] > y && xa[i] <= x && x <= xb[i]) {
if ((tt[1] == 0) || (ya[i] < ya[tt[1]]))
tt[1] = i;
}
if (xb[i] < x && ya[i] <= y && y <= yb[i]) {
if ((tt[2] == 0) || (xb[i] > xb[tt[2]]))
tt[2] = i;
}
if (yb[i] < y && xa[i] <= x && x <= xb[i]) {
if ((tt[3] == 0) || (yb[i] > yb[tt[3]]))
tt[3] = i;
}
}
for (int i = 0; i < 4; ++i)
if (tt[i]) ins(S, num[tt[i]][i]);
x = xt; y = yt;
for (int i = 1; i <= n; ++i) {
if (xa[i] - 1 == x) {
if (y < ya[i] && ((to[i][0][0] == 0 && ya[i] > y) || (to[i][0][0] != 0 && yb[to[i][0][0]] < y)))
ins(num[i][0], T);
if (y > yb[i] && ((to[i][0][1] == 0 && yb[i] < y) || (to[i][0][1] != 0 && ya[to[i][0][1]] > y)))
ins(num[i][0], T);
}
if (ya[i] - 1 == y) {
if (x < xa[i] && ((to[i][1][0] == 0 && xa[i] > x) || (to[i][1][0] != 0 && xb[to[i][1][0]] < x)))
ins(num[i][1], T);
if (x > xb[i] && ((to[i][1][1] == 0 && xb[i] < x) || (to[i][1][1] != 0 && xa[to[i][1][1]] > x)))
ins(num[i][1], T);
}
if (xb[i] + 1 == x) {
if (y < ya[i] && ((to[i][2][0] == 0 && ya[i] > y) || (to[i][2][0] != 0 && yb[to[i][2][0]] < y)))
ins(num[i][2], T);
if (y > yb[i] && ((to[i][2][1] == 0 && yb[i] < y) || (to[i][2][1] != 0 && ya[to[i][2][1]] > y)))
ins(num[i][2], T);
}
if (yb[i] + 1 == y) {
if (x < xa[i] && ((to[i][3][0] == 0 && xa[i] > x) || (to[i][3][0] != 0 && xb[to[i][3][0]] < x)))
ins(num[i][3], T);
if (x > xb[i] && ((to[i][3][1] == 0 && xb[i] < x) || (to[i][3][1] != 0 && xa[to[i][3][1]] > x)))
ins(num[i][3], T);
}
}
memset(dist, 127, sizeof(dist));
dist[S] = 0;
Q.push(Qnode(S, 0));
Qnode u;
while (!Q.empty()) {
u = Q.top(); Q.pop();
if (inq[u.id]) continue;
inq[u.id] = true;
for (int i = point[u.id]; i; i = E[i].nxt)
if (dist[u.id] + 1 < dist[E[i].to]) {
dist[E[i].to] = dist[u.id] + 1;
Q.push(Qnode(E[i].to, dist[E[i].to]));
}
}
printf("%d\n", dist[T] == dist[0] ? 0 : dist[T]);
return 0;
}
【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险的更多相关文章
- BZOJ 2541: [Ctsc2000]冰原探险
Descrption 有一些矩形障碍,碰到障碍会停下,求从一个点到另一个点的最少移动步数. Sol BFS. 因为题目的特殊性质,两个矩形没有任何相邻,起始点和终点和矩形没有相邻. 所以从一个点的移动 ...
- [Ctsc2000]冰原探险
Description 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历 ...
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 897 Solved: 394[Submit][Status ...
- [题目] Luogu P3716 [CTSC2000]冰原探险
题面 题目背景 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历史,每个 ...
- bzoj:1221;vijos 1552 软件开发
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- bzoj 1084;vijos 1191 [SCOI2005] 最大子矩阵
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 【[CTSC2000]冰原探险】
noip前练一下码力还是非常有前途的 这道题本来就是想写个大暴力弃疗的,所以直接强上暴力浑身舒爽 结果发现要不是判重的时候脑残了,就能\(A\)了 没什么好说的呀,就是每一次都暴力\(O(n)\)往上 ...
- 【BZOJ 1146】【CTSC 2008】网络管理network
一句话题意,树链上带改动区间第k大 感觉能够dfs+主席树O(nlog2n)过掉,但我不会写= = 于是写的线段树套平衡树+链剖+二分(改动O(nlog3n),查询O(nlog4n)慢了好多啊QAQ) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- [转]Android应用程序框架思路整理
一.一般Android应用程序架构(Book,购彩,Market). 普通的应用程序由于只需要用到Android的联网与显示的功能,所以应用程序大体上是呈现为UI(Activities)与网络(Net ...
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...
- Hadoop学习
Hadoop: 大数据里面的公认的解决方案标准 链接推荐:http://www.powerxing.com/install-hadoop/ 第一天 Hadoop的基本概念 伪分布式集群安装 hdfs ...
- yii2实战教程之第一个Yii程序
之前考虑过要不要砍掉该章节,直接上手教你搭建简单的博客系统.出于实战基础加之自C语言的书籍出版以来,几乎所有的编程书籍都讲述了一个Hello World的例子作为开始.虽然我们仅仅是学习Yii2,但是 ...
- ORA-00600: internal error code, arguments: [17281], [1001], [0x1FF863EE8], [], [], [], [], []
我们生产服务器中的一个数据库发出监控告警日志的邮件,内容如下所示,在31号09:11分出现了大名鼎鼎的ORA-00600错误. Dear All: The Instance xxx' alert lo ...
- MySQL高可用架构之MHA
简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...
- linux mail利用外部邮箱地址发邮件
mail命令发送邮件需要sendmail或postfix服务 三种常用格式发信 mail -s "标题" xxx@xxx.xxx #第一种方法,你可以把当前shell当成编辑器来用 ...
- 使用Vmware虚拟机部署开发环境之Mac OS X系统安装
一.使用VMware虚拟机部署Swift开发环境所需工具: Vmware Workstation 10.0虚拟机软件 VM安装Mac解锁工具Unlock 苹果操作系统(Mac OS X Maveric ...