紫书 习题 8-16 UVa 1618 (中途相遇法)
暴力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 (中途相遇法)的更多相关文章
- UVa 1152 (中途相遇法) 4 Values whose Sum is 0
题意: 要从四个数组中各选一个数,使得这四个数之和为0,求合法的方案数. 分析: 首先枚举A+B所有可能的值,排序. 然后枚举所有-C-D的值在其中用二分法查找. #include <cstdi ...
- 紫书 例题8-3 UVa 1152(中途相遇法)
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
- 【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) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...
- 高效算法——J 中途相遇法,求和
---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
Difference Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
随机推荐
- 队列Queue的get方法
写了一段生产者消费者模型的代码: from time import sleep from random import randint, random from multiprocessing impo ...
- IOS - 6\7下UINavigationBar的颜色的方法改变 ——转载http://www.th7.cn/Program/IOS/201310/155057.shtml
IOS7下设置UINavigationBar的颜色的方法已经改变(当然如果是用自定义图片的话请忽略---) 首先是区别iOS7和之前版本的方法如下: //如果是iOS7以前的话if (floor(NS ...
- $attr和$listeners is readonly
https://www.jb51.net/article/132371.htm 出现这个问题的原因,主要是因为在使用的时候出现了A组件调用B组件,B组件再调用了C组件.而直接使用了A组件修改C组件的数 ...
- idea 编辑器 光标问题!(insert键)
今天写代码不小心按了键盘的insert键,光标莫名闪退了 ,重新打开的时候发现 光标变成了 按了insert 的效果 ,简直无语的要命啊! 这敲代码太恶心了!怒搜资料 结果找到了解决办法! 1.打 ...
- Android源代码解析之(七)-->LruCache缓存类
转载请标明出处:一片枫叶的专栏 android开发过程中常常会用到缓存.如今主流的app中图片等资源的缓存策略通常是分两级.一个是内存级别的缓存,一个是磁盘级别的缓存. 作为android系统的维护者 ...
- Android程序之全国天气预报查询(聚合数据开发)
一.项目演示效果例如以下: 项目源码下载地址: http://pan.baidu.com/s/1pL6o5Mb password:5myq 二.使用 聚合数据SDK: (1)聚合数据官网地址:http ...
- .Net MVC的学习(一)
套种间作,也挺有意思的--近来学习感悟.DRP学习的同一时候,折腾了点曾经不曾学习可是却非常多次耳闻过的东西--Asp.Net中的MVC架构模式. 一.是什么? MVC,即(Model-View-Co ...
- Testbench的编写
Testbench的作用,在于给我们编写的可综合代码的模块送入激励.即在我们波形仿真中用编写testbench来代替拖拽波形.其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的 ...
- 整数翻转C++实现 java实现 leetcode系列(七)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...
- mfc进制转换
; CString str; m_edit1.GetWindowTextW(str); swscanf_s(str, _T("%d"), &num); _TCHAR str ...