CE求助!!!!!!!!!!!
查看原帖
CE求助!!!!!!!!!!!
100325
peterwuyihong楼主2020/8/11 10:46

没见过CECE求助的叭你还好意思


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
void read(int &x){
	short f=1;char ch=getchar();x=0;
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}x*=f;
}
#define maxn 100010
int a[maxn];
vector<int>v[400];
int pos[maxn],L[400],R[400];
int n,m,t;
int l,r,k;
int o[maxn];
int count(int x,int l,int r){
	int p=pos[l],q=pos[r];
	int ans=0;
	if(p==q){
		for(int i=l;i<=r;i++)ans+=a[i]<=x;
		return ans;
	}
	for(int i=p+1;i<=q-1;i++)ans+=upper_bound(v[i].begin(),v[i].end(),x)-v[i].begin();
	for(int i=l;i<=R[p];i++)ans+=a[i]<=x;
	for(int i=L[q];i<=r;i++)ans+=a[i]<=x;
	return ans;
}
signed main(){
#ifndef ONLINE_JUDGE
	freopen("testdata.in","r",stdin);
#endif
	read(n),read(m);
	for(int i=1;i<=n;i++)read(a[i]);
	for(int i=1;i<=n;i++)o[i]=a[i];
	sort(o+1,o+n+1);
	t=sqrt(n);
//	cout<<n<<' '<<m<<' '<<t<<endl;
	for(int i=1;i<=t;i++){
		L[i]=(i-1)*sqrt(n)+1;
		R[i]=i*sqrt(n);
	}
	if(R[t]<n)R[++t]=n,L[t]=R[t-1]+1;
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++)
		pos[j]=i,v[i].push_back(a[j]);
		sort(v[i].begin(),v[i].end());
	}
//	for(int i=1;i<=t;i++,puts(""))
//	for(int j=0;j<(int)v[i].size();j++)
//	printf("%d ",v[i][j]);
	while(m--){
		read(l),read(r),read(k);
		int ll=1,rr=n,mid;
		while(ll<=rr){
			mid=(ll+rr)>>1;//check表示[l,r]中是否有k个大于mid
		//	printf("count(%d,%d,%d) when k is %d is %d\n",o[mid],l,r,k,count(o[mid],l,r));
			if(count(o[mid],l,r)>=k)rr=mid-1;
			else ll=mid+1;
		}
		printf("%d\n",o[ll]);
	}
}

bitsbits就可以编译,但是死活不能在POJPOJ上逃脱CECE,请路过的dalaodalao们解释以下原理

2020/8/11 10:46
加载中...