Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树
本文共 2732 字,大约阅读时间需要 9 分钟。
题意:
化简一下题意就是求满足 m a x ( 1 , x ) = m i n ( x + 1 , y ) = m a x ( y + 1 , n ) max(1,x)=min(x+1,y)=max(y+1,n) max(1,x)=min(x+1,y)=max(y+1,n)的 l e n 1 = x , l e n 2 = y − x , l e n 3 = n − y len1=x,len2=y-x,len3=n-y len1=x,len2=y−x,len3=n−y。
思路:
首先我们暴力做法就是 n 2 n^2 n2枚举 x , y x,y x,y的位置,让后判断 ( y + 1 , n ) (y+1,n) (y+1,n)是否符合条件,复杂度 O ( n 2 l o g n ) O(n^2logn) O(n2logn)。
考虑优化一下,我们可以只枚举
x x x,让后根据
m i n min min和
m a x max max的可二分性,即越往后
m i n min min越小,
m a x max max越大。根据这个性质我们二分
y y y的位置。设
m a x ( 1 , x ) = m x max(1,x)=mx max(1,x)=mx,如果
[ x + 1 , m i d ] [x+1,mid] [x+1,mid]的
m i n min min小于
m x mx mx,那么说明位置太靠前了,需要向后移动,如果大于
m x mx mx,说明位置太靠后了,要往前移动,如果等于
m x mx mx的话,说明
m i n min min符合了,我们就根据
[ m i d + 1 , n ] [mid+1,n] [mid+1,n]的
m a x max max值来判断,跟判断
m i n min min的方法差不多。
用的线段树,复杂度 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)。
//#pragma GCC optimize(2)#include #include #include #include #include
转载地址:http://eplx.baihongyu.com/