排序
排序
题解
我们可以考虑将它转化成01数列来操作,用线段树来维护,再二分答案。
不过这题数据好像有点水,笔者用桶排加优化就过了。
源码
笔者没打标准的题解。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define MAXN 100005
using namespace std;
typedef long long LL;
const LL INF=0x3f3f3f3f;
int n,m,a[MAXN],qq;
bool vis[MAXN];
#define gc() getchar()
template<typename _T>
inline void read(_T &x)
{
    _T f=1;x=0;char s=gc();
    while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}
    while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}
    x*=f;
}
int main()
{
	read(n);read(m);
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=m;i++)
	{
		int opt,l,r;
		read(opt);read(l);read(r);
		int maxx=0,minn=INF;
		for(int j=l;j<=r;j++)
		{
			vis[a[j]]=true;
			if(maxx<a[j]) maxx=a[j];
			if(minn>a[j]) minn=a[j];
		}
		if(opt==0)
		{
			for(int j=minn;j<=maxx;j++)
				if(vis[j])
					a[l++]=j,vis[j]=false;
		}
		else
			for(int j=maxx;j>=minn;j--)
				if(vis[j])
					a[l++]=j,vis[j]=false;
	}
	read(qq);
	printf("%d",a[qq]);
    return 0;
} 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号