题意:一段区间,让你分割成三段,第一段取max,第二段取min,第三段取max。问你怎么分割这个区间。

题解:

三个区间我们可以用两个点将一段区间分成三段区间。

二分:我们首先找这个题有关的单调性,我们枚举左边的点(也就是l),对于每个枚举的左边的点(l),我们二分找右边的那个点(r),为什么可以二分呢,因为这个区间是具有单调性的
1.如果r越往左边靠,我们看y这段区间,那么他的min值只会增大或不变,再看z这段区间,max值只会增大或不变。
2.如果r越往右边靠,我们看y这段区间,那么他的min值只会减少或不变,再看z这段区间,max值只会减小或不变。

所以对于每次枚举的一个端点l
他区间x的最大值不变,那么我们用最大值与y区间的min和z区间的max比较。我们会发现:
1.当x.max>y.min&&x.max<z.max或者x.max<y.min&&x.max>z.max这一种情况,你无论往哪边移动,都不会可以。这种情况说明x这个点不应该在枚举的地方,这个时候我们直接break继续枚举下一个点即可。
2.如果x.max<y.min&&x.max>z.min或者x.max==y.min&&x.max<z.max或者x.max<y.min&&x.max==z.max我们让他往右移
3.如果x.max>y.min&&x.max>z.min或者x.max==y.min&&x.max>z.max或者x.max>y.min&&x.max==z.max我们让他往左移
4.如果x.max==y.min==z.max,这样的话我们就可以直接跳出这个循环输出答案即可,当然你记录的是区间的两个下标,所以要处理一下即可

处理区间最大最小的时候可以用线段树或者树状数组

代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
//#define int long long#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =2e5+10;
const int MaxN = 1e9+7;
const int MinN = -1e9+7;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const int N = 5e6 + 100;int a[maxn];
int imax,imin;
struct wazxy{int maxx,minn;
}s[maxn<<2];
int n;
void build(int node,int l,int r){s[node].maxx=MinN;s[node].minn=MaxN;if(l==r){s[node].maxx=s[node].minn=a[l];return ;}int mid=(l+r)>>1;build(node*2,l,mid);build(node*2+1,mid+1,r);s[node].maxx=max(s[node*2].maxx,s[node*2+1].maxx);s[node].minn=min(s[node*2].minn,s[node*2+1].minn);
}void query(int node,int start,int ends,int l,int r){if(start>=l&&ends<=r){imax=max(imax,s[node].maxx);imin=min(imin,s[node].minn);//cout<<imax<<" "<<imin<<endl;return ;}int mid=(start+ends)>>1;if(l<=mid)  query(node*2,start,mid,l,r);if(mid<r) query(node*2+1,mid+1,ends,l,r);
}
bool tot=false;
bool ok=false;
inline bool che(int x,int y){int xx,yy,zz;imax=MinN;query(1,1,n,1,x-1);xx=imax,imin=MaxN;query(1,1,n,x,y);yy=imin,imax=MinN;query(1,1,n,y+1,n);zz=imax;if((xx<yy&&xx>zz)||(xx>yy&&xx<zz)){tot=true;return true;}if(xx<yy&&xx<zz){return true;//true右移}if(xx>yy&&xx>zz) return false;//false左移if(xx==yy&&xx==zz){ok=true;return true;}if(xx==yy){if(xx<zz) return true;else return false;}if(xx==zz){if(xx<yy) return true;else return false;}
}signed main(){//ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}build(1,1,n);int ansx=-1,ansy=-1;for(int i=1;i<=n;i++){int l=i+1,r=n-1;tot=false,ok=false;int mid;while(l<=r){mid=(l+r)/2;if(che(i+1,mid)){if(tot) break;if(ok) break;l=mid+1;}else r=mid-1;}if(ok){ansx=i+1;ansy=mid;break;}}if(ansx==-1) cout<<"NO"<<endl;else{cout<<"YES"<<endl;cout<<ansx-1<<" "<<ansy-ansx+1<<" "<<n-(ansx-1)-(ansy-ansx+1)<<endl;}}return 0;
}

Codeforces Round #686 (Div. 3) F. Array Partition(二分+线段树)相关推荐

  1. Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树

    传送门 文章目录 题意: 思路: 题意: 化简一下题意就是求满足max(1,x)=min(x+1,y)=max(y+1,n)max(1,x)=min(x+1,y)=max(y+1,n)max(1,x) ...

  2. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

    传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...

  3. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  4. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  5. Codeforces Round #193 (Div. 2) B. Maximum Absurdity(线段树+思维)

    题目要求我们找到两个长度为 k 的不相交的子段,使得这两个子段之和最大,输出这两个子段的左端点 先将 [k,n] 的长度为 k 的子段和求出来,将其放入线段树中,然后枚举区间 i∈[k,n],使 i ...

  6. Codeforces Round #686 (Div. 3) A-F题解

    Codeforces Round #686 (Div. 3) A-F题解 A. Special Permutation 题意 给定 nnn ,输出一个长度为 nnn 的全排列,每个位置 iii 上的数 ...

  7. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  8. Codeforces Round #644 (Div. 3) F.Spy-string

    Codeforces Round #644 (Div. 3) F.Spy-string 题目链接 You are given n strings a1,a2,-,an: all of them hav ...

  9. Codeforces Round #849 (Div. 4) F. Range Update Point Query

    Codeforces Round #849 (Div. 4) F. Range Update Point Query 题目大意: 给一串数字,有两个操作: 操作1:将 l − r l-r l−r 的数 ...

最新文章

  1. 使用 UIBezierPath 进行简单的图形绘制
  2. python字典的实现原理_Python字典的实现原理
  3. TestNG 自动化测试入门教程--典型示例
  4. 7-3 逆序的三位数 (10 分)
  5. 备案域名绑定服务器后 提示需要备案_小程序开发需要多少钱?
  6. setGeometry: Unable to set geometry 493x379+674+326 (frame: 517x443+662+274) on QWidgetWindow/“Dialo
  7. 九、Promises
  8. 男孩子初中毕业学计算机技术,男孩子初中毕业学什么技术好就业
  9. Hyper-V 2016 系列教程44 System Center 2016 Data Protection Manager 介绍和工作原理
  10. MySQL特有的SQL语句 第一弹
  11. Redis安装教程(保姆级详细图文)
  12. 正逻辑与负逻辑的关系
  13. 图片边缘出现黑点的问题分析和解决(纹理过滤)
  14. 英语单词:前缀、后缀、词根---总结大全
  15. Bugku:杂项 一枝独秀
  16. XPDL与WS-BPEL的比较之一:规范发展篇
  17. ret-sync插件:windbg/ollydbg+ida逆向调试神器
  18. 教你保护相册里的「小秘密」,如何在 iPhone 和 iPadOS 中隐藏照片
  19. dos下用move命令移动文件夹
  20. Git版本控制管理——diff

热门文章

  1. 成功爬取CVE-2019-9766漏洞复现【CSDN】【1】
  2. 记录一些user-agent
  3. 正确debug的TensorFlow的姿势
  4. 超全汇总!机器学习常用术语词汇表
  5. Angular5学习笔记 - 虚拟RestfulApi配置与使用(六)
  6. 4、EIGRP配置实验之手动汇总
  7. 201671010145 2016-2017《Java程序设计》JAVA语言中,异常处理有哪几种方式?
  8. Hobby开挂!加速web编码
  9. 人民搜索,该怎么说你才好
  10. unicode编码过php的magic_quotes_gpc设置为on的mysql注入与文件写入(待测试)