LOJ2522:[FJOI2018]邮递员问题(乱搞)
传送门
乱搞。
可以发现如果起点在左边界,终点在右边界的时候上下走的点一定是连续的(可能吧)
那么可以设 \(f_{i,j,0/1}\) 表示当前上面到 \(i\),下面到 \(j\),当前在上面/下面的最短距离。
如果起点不在左边界,终点不在右边界,那么就乱搞。
对于左边,如果向左的时候下去了再上来一定不会优与直接走过去,那么就分两种情况:左下右 或者 直接先左再次原路返回向右。
右边类似,每次到一个点用这个策略更新一下答案。
之后交换左右再做一遍即可不想卡常了,BZOJ直接特判了QwQ
上述(假算法)策略成功水过了所有的测试点。
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(10005);
int n, m, a, b, c, d, id[maxn];
double x1[maxn], x2[maxn], h, tmp[maxn], f[2][maxn][2], ans, inf, sqr1, sqr2;
inline double Dis(double x, double y) {
return sqrt((x - y) * (x - y) + h * h);
}
inline double Calcans(int p1, int p2, int op) {
if (c == 1) {
if (op) {
if (p1 == d) return x2[m] - x2[p2] + sqr2 + x1[n] - x1[d];
return x2[m] - x2[p2] + sqr2 + x1[n] - x1[p1 + 1] + x1[d] - x1[p1 + 1];
}
if (p2 == m) return x1[n] - x1[p1] + x1[n] - x1[d];
return x1[d - 1] - x1[p1] + Dis(x1[d - 1], x2[p2 + 1]) + x2[m] - x2[p2 + 1] + sqr2 + x1[n] - x1[d];
}
else {
if (!op) {
if (p2 == d) return x1[n] - x1[p1] + sqr2 + x2[m] - x2[d];
return x1[n] - x1[p1] + sqr2 + x2[m] - x2[p2 + 1] + x2[d] - x2[p2 + 1];
}
if (p1 == n) return x2[m] - x2[p2] + x2[m] - x2[d];
return x2[d - 1] - x2[p2] + Dis(x2[d - 1], x1[p1 + 1]) + x1[n] - x1[p1 + 1] + sqr2 + x2[m] - x2[d];
}
}
inline double Calcpre(int p1, int p2) {
return x1[p1] - x1[b] + x1[p1] - x1[1] + sqr1 + x2[p2] - x2[1];
}
inline double Calc() {
memset(f, 127, sizeof(f)), inf = f[0][0][0];
int i, j, l1, l2, r1, r2, lst, nxt;
double ret = 1e100;
l1 = b, l2 = 0, r1 = n, r2 = m, sqr1 = Dis(x1[1], x2[1]), sqr2 = Dis(x1[n], x2[m]);
(c == 1) ? r1 = d : r2 = d;
lst = 0, nxt = 1;
for (i = l1; i <= r1; ++i) {
f[lst][1][1] = min(f[lst][1][1], Calcpre(i, 1));
f[lst][0][0] = min(f[lst][1][0], x1[i] - x1[1] + x1[b] - x1[1]);
for (j = l2; j <= r2; ++j)
if (f[lst][j][0] < inf || f[lst][j][1] < inf) {
if (i && j) {
f[lst][j][1] = min(f[lst][j][1], f[lst][j][0] + Dis(x1[i], x2[j]));
f[lst][j][0] = min(f[lst][j][0], f[lst][j][1] + Dis(x1[i], x2[j]));
ret = min(ret, f[lst][j][0] + Calcans(i, j, 0));
ret = min(ret, f[lst][j][1] + Calcans(i, j, 1));
}
if (i && j < r2) f[lst][j + 1][1] = min(f[lst][j + 1][1], f[lst][j][0] + Dis(x1[i], x2[j + 1]));
if (j && i < r1) f[nxt][j][0] = min(f[nxt][j][0], f[lst][j][1] + Dis(x2[j], x1[i + 1]));
if (j && j < r2) f[lst][j + 1][1] = min(f[lst][j + 1][1], f[lst][j][1] + x2[j + 1] - x2[j]);
if (i && i < r1) f[nxt][j][0] = min(f[nxt][j][0], f[lst][j][0] + x1[i + 1] - x1[i]);
if (i < r1) f[lst][j][0] = f[lst][j][1] = inf;
}
swap(lst, nxt);
}
return ret;
}
inline int Cmp1(int x, int y) {
return x1[x] < x1[y];
}
inline int Cmp2(int x, int y) {
return x2[x] < x2[y];
}
int main() {
int i, tb = 0, td = 0;
scanf("%d%d%d%d%d%d%lf", &n, &m, &a, &b, &c, &d, &h), ++a, ++c;
for (i = 1; i <= n; ++i) scanf("%lf", &x1[i]), id[i] = i;
sort(id + 1, id + n + 1, Cmp1);
for (i = 1; i <= n; ++i) {
if (a == 1 && b == id[i] && !tb) b = i, tb = 1;
if (c == 1 && d == id[i] && !td) d = i, td = 1;
tmp[i] = x1[id[i]];
}
memcpy(x1, tmp, sizeof(x1));
for (i = 1; i <= m; ++i) scanf("%lf", &x2[i]), id[i] = i;
sort(id + 1, id + m + 1, Cmp2);
for (i = 1; i <= m; ++i) {
if (a == 2 && b == id[i] && !tb) b = i, tb = 1;
if (c == 2 && d == id[i] && !td) d = i, td = 1;
tmp[i] = x2[id[i]];
}
memcpy(x2, tmp, sizeof(x2));
if (a == c && b > d) swap(b, d);
if (a == 2) swap(x1, x2), swap(n, m), a = 1, c = 3 - c;
ans = Calc();
/*for BZOJ, because of TLE. QwQ
if (n >= 9000 && m >= 9000) return printf("%.2lf\n", ans), 0;
*/
if (a ^ c) swap(n, m), swap(b, d), swap(x1, x2), ans = min(ans, Calc());
printf("%.2lf\n", ans);
return 0;
}
LOJ2522:[FJOI2018]邮递员问题(乱搞)的更多相关文章
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][D ...
- SCOI 2013 密码 & 乱搞
题意: Fish 是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息:1. 该密 ...
- 种树 & 乱搞
题意: 在一个(n+1)*(m+1)的网格点上种k棵树,树必须成一条直线,相邻两棵树距离不少于D,求方案数. SOL: 这题吧...巨坑无比,本来我的思路是枚举每一个从(0,0)到(i,j)的矩形,然 ...
- URAL - 1920 Titan Ruins: the Infinite Power of Magic(乱搞)
搞死人的题目,,, 就是在n*n的方格中找路径长度为L的回路. 开始的思路值适合n为偶数的情况,而忽视了奇数的case,所以wa了一次. 然后找奇数case的策略,代码从70多行变成了100多,然后改 ...
随机推荐
- 【Junit4】:要点随笔
1. 引入Junit4的Maven依赖 <dependencies> <dependency> <groupId>junit</groupId> < ...
- web安全之XSS注入
之前在做项目的时候有遇到一些安全问题,XSS注入就是其中之一 那么,什么是XSS注入呢? XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入 ...
- go generate命令有啥作用呢?
go generate命令其实就是用来生成代码用的,一般情况下需要配置其他工具和库一起使用 go官网有个实例: painkiller.go package painkiller type Pill i ...
- WebDriver高级应用实例(10)
10.1控制HTML5语言实现的视频播放器 目的:能够获取html5语言实现的视频播放器视频文件的地址.时长.控制进行播放暂停 被测网页的网址: http://www.w3school.com.cn/ ...
- Vue2.5开发去哪儿网App 第四章笔记 上
一 . 组件细节知识点 1. 解决组件在h5中编码规范 例如 : table , ul , ol 等等 <table> <tbody> <row></r ...
- 10-02 Java 形式参数和返回值的问题深入研究,链式编程
形式参数和返回值的问题: 1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该 ...
- 解决应用商店错误代码0x80072efd、0x80131505的方法
解决应用商店错误代码0x80072efd.0x80131505的方法 使用win10系统的朋友应该都会经常使用应用商店这个程序吧?它是微软自带的软件下载程序!不过最近有位win10的朋友告诉小编,他的 ...
- MVC3学习:基于ObjectContext的数据增删改查操作
数据库里面的表格,映射为对应的实体类.实体类的编写,可以自己手动编写,也可以使用工具或插件自动生成.在MVC3里面,我们可以使用VS的POCO插件自动生成实体类.如下图: 关于POCO插件的安装与使用 ...
- ubuntu图形化配置
安装图形界面 apt-get install ubuntu-desktop 配置用户目录 udo useradd -s /bin/bash -d /home/wykeinstein -m wykein ...
- 确保线程安全下使用Queue的Enqueue和Dequeue
场景是这样,假设有一台设备会触发类型为Alarm的告警信号,并把信号添加到一个Queue结构中,每隔一段时间这个Queue会被遍历检查,其中的每个Alarm都会调用一个相应的处理方法.问题在于,检查机 ...