排序

排序

题解

我们可以考虑将它转化成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;
}

谢谢!!!

posted @ 2019-11-12 20:28  StaroForgin  阅读(9)  评论(0)    收藏  举报  来源