暴力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<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 5123;
int a[MAXN], n;
vector<int> 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;
}

紫书 习题 8-16 UVa 1618 (中途相遇法)的更多相关文章

  1. UVa 1152 (中途相遇法) 4 Values whose Sum is 0

    题意: 要从四个数组中各选一个数,使得这四个数之和为0,求合法的方案数. 分析: 首先枚举A+B所有可能的值,排序. 然后枚举所有-C-D的值在其中用二分法查找. #include <cstdi ...

  2. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  3. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  4. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

  5. 高效算法——J 中途相遇法,求和

    ---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  6. 【UVALive】2965 Jurassic Remains(中途相遇法)

    题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...

  7. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  8. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  9. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

随机推荐

  1. 【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游 - LCT+泰勒展开

    咕咕咕?咕咕咕! 题意: Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言 ...

  2. 决策树(Decision Trees)

    简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...

  3. pytorch 6 batch_train 批训练

    import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible # BATCH_SIZE = 5 BA ...

  4. Python3的URL编码解码

    前言 博主最近在用python3练习一些爬虫脚本的时候,发现一些url的编码问题,在浏览器提交请求api时,如果url中包含汉子,就会被自动编码掉.呈现的结果是 ==> %xx%xx%xx.如果 ...

  5. mysql5.7官网直译SQL语句优化--分组优化

    1.14Group By Optimization 分组优化 大多数方法为了满足分组查询需要扫描整个表并且创建一个临时表,其中每组中的值都是连续的,如果可以使用聚合函数和临时表获取各个分组.在某些情况 ...

  6. [using_microsoft_infopath_2010]Chapter3 表单设计基础:使用InfoPath布局,控件,和视图

    本章概要 1.使用InfoPath的布局工具构建吸引人的表单 2.使用InfoPath表格工具 3.在表单上添加字段和控件 4.使用section和container组织表单里的控件 5.在一个表单上 ...

  7. 【MFC设置静态文本框背景为透明】

    视图类中加入OnCtlColor()函数: IDC_STATIC1为静态文本框ID HBRUSH CAngleView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT n ...

  8. hdu 5335 Walk Out 搜索+贪心

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  9. Okio简化处理I/O操作原理

    转载:http://blog.csdn.net/sbsujjbcy/article/details/50523623 Okio库是一个由square公司开发的,它补充了java.io和java.nio ...

  10. GitBlit中出现 error: remote unpack failed: error Missing tree

    clu@WASYGSHA01-1020 MINGW64 /d/ChuckLu/Git/Edenred/LISA_5.0.0.0 (local)$ git push origin preaction:p ...