博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
紫书 习题 8-16 UVa 1618 (中途相遇法)
阅读量:6697 次
发布时间:2019-06-25

本文共 1608 字,大约阅读时间需要 5 分钟。

暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断。

一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn)

(1)两种比较方式是相反的, 所以第二次可以直接把数组倒过来做, 代码可以省很多。

(2) 我们现在来讨论3 1 4 2这种情况(1最小, 2次小以此类推)

大家观察可以发现, 中间两个数字刚好是最大和最小。所以我们可以枚举中间两个数, 往两边找。

先看1, 我们可以预处理出每一个数左侧比它大的数字有哪些。然后找到1的时候, 就可以在左侧二分

找到大于1而小于4的最大数字是多少, 最大是因为这个数要大于2, 所以最大肯定是最优的。

同理右边也可以预处理出右侧小于它的数字有哪些, 然后二分小于4而大于1的最小的数字是什么

最后合起来判断, 如果左边找出的数字大于右边, 那么就找出了解。

(3)二分一定一定一定要注意找不到的情况, 因此WA了n次

#include
#include
#include
#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 5123;int a[MAXN], n; vector
l[MAXN], r[MAXN]; bool judge(){ REP(i, 0, n) //预处理 { l[i].clear(); r[i].clear(); REP(j, i + 1, n) if(a[j] < a[i]) r[i].push_back(a[j]); for(int j = i - 1; j >= 0; j--) if(a[j] > a[i]) l[i].push_back(a[j]); sort(l[i].begin(), l[i].end()); //为了后面二分 sort(r[i].begin(), r[i].end()); } REP(i, 1, n) REP(j, i + 1, n - 1) if(a[i] < a[j] && l[i].size() > 0 && r[j].size() > 0) { int t1 = lower_bound(l[i].begin(), l[i].end(), a[j]) - l[i].begin(); int t2 = lower_bound(r[j].begin(), r[j].end(), a[i]) - r[j].begin(); if(t1 == 0 || t2 == r[j].size()) continue; //根本找不到就舍去 if(l[i][t1-1] > r[j][t2]) return true; } return false;}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%d", &n); REP(i, 0, n) scanf("%d", &a[i]); if(judge()) { puts("YES"); continue; } reverse(a, a + n); //翻转 if(judge()) { puts("YES"); continue; } puts("NO"); } return 0;}

转载于:https://www.cnblogs.com/sugewud/p/9819562.html

你可能感兴趣的文章
php输出mysqli查询出来的结果
查看>>
[唐诗]182宫中行乐词(其一)-李白
查看>>
设计模式之禅之六大设计原则-依赖倒置原则
查看>>
ML2 配置 OVS VxLAN - 每天5分钟玩转 OpenStack(146)
查看>>
【转】TCP协议的无消息边界问题
查看>>
SQL Server-数据类型(七)
查看>>
Android Studio项目整合PullToRefresh的问题记录
查看>>
Variant 与 内存泄露
查看>>
WebSocket实战之————GatewayWorker使用笔记例子
查看>>
动手实践 Linux VLAN - 每天5分钟玩转 OpenStack(13)
查看>>
C语言 第八章 函数、指针与宏
查看>>
177.2. repository 管理
查看>>
[20150629]12c物化视图刷新Out of place
查看>>
基于.net开发chrome核心浏览器【四】
查看>>
Linux下编译安装Apache httpd 2.4
查看>>
.subversion
查看>>
TensorFlow训练单特征和多特征的线性回归
查看>>
linux的du使用方法
查看>>
STL容器删除元素的陷阱
查看>>
分析数据库CitusDB:提供弹性计算能力
查看>>