ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C20220725T2 运动

2022-08-31 12:31:19  阅读:164  来源: 互联网

标签:int C20220725T2 read while l1 inline 运动 c11


给定序列 \(s\) ,求满足 \(max\{s_{i,j}\}-min\{s_{i,j}\}\leq k\) 的最大长度 \(j-i\) 。 \(n\leq 3\times10^6\) 。(时限3s)


没想到 \(O(n\,log\,n)\) 没有被卡掉。首先判断区间的最大最小值可以用单调队列 \(O(n)\) 求出,然后就二分就好了,跑的飞快。

然后是 \(O(n)\) 的正解,其实只需要将思路转换一下,在单调队列中记录最大值和最小值,若 \(max-min>k\) 就 \(pop\) 出队,这样就是 \(O(n)\) 的了。(只有 \(O(n\,log\,n)\) 的代码)。

#include<bits/stdc++.h>
using namespace std;
struct IO{
    inline char read(){
        static const int IN_LEN=1<<18|1;
        static char buf[IN_LEN],*s,*t;
        return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++;
    }
    template <typename _Tp> inline IO & operator >> (_Tp&x){
        static char c11,boo;
        for(c11=read(),boo=0;!isdigit(c11);c11=read()){
            if(c11==-1)return *this;
            boo|=c11=='-';
        }
        for(x=0;isdigit(c11);c11=read())x=x*10+(c11^'0');
        boo&&(x=-x);
        return *this;
    }
    inline void push(const char &c) {
    	putchar(c);
	}
	template <class T>
	inline void write(T x){
		if (x < 0) x = -x, push('-');
		static T sta[35];
		T top = 0;
		do {
			sta[top++] = x % 10, x /= 10;
		} while (x);
		while (top) push(sta[--top] + '0');
	}
	template <class T>
	inline void write(T x, char lastChar){
		write(x),push(lastChar);
	}
}io;

int k,n;
int a[3000005];
int maxn[3000005],minn[3000005];

bool solve(int L){
	int l1=1,l2=1,r1=0,r2=0;
	for(int i=1;i<=n;++i){
		while(l1<=r1 && i-maxn[l1]>=L)
			++l1;
		while(l1<=r1 && a[maxn[r1]]<a[i])
			--r1;
		maxn[++r1]=i;
		while(l2<=r2 && i-minn[l2]>=L)
			++l2;
		while(l2<=r2 && a[minn[r2]]>a[i])
			--r2;
		minn[++r2]=i;
		if(i>=L){
			if(a[maxn[l1]]-a[minn[l2]]<=k)
				return 1;
		}
	}
	return 0;
}


int main(){
	io>>k>>n;
	for(int i=1;i<=n;++i)
		io>>a[i];
	int l=1,r=n+1;
	while(l<r){
		int mid=(l+r)>>1;
		int g=solve(mid);
		if(g)
			l=mid+1;
		else
			r=mid;
	}
	printf("%d",l-1);
	return 0;
}

标签:int,C20220725T2,read,while,l1,inline,运动,c11
来源: https://www.cnblogs.com/zhouzizhe/p/16642655.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有