【悬关】RE求助
查看原帖
【悬关】RE求助
749325
Sincerin楼主2023/11/10 21:29

RT, 万分感谢。

#include<iostream>
#include<cstdio> 
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
#define ri register int
#define rd(n) n=read()
inline int read(void)
{
    register int res=0,f=0;
    register char c=getchar();
    while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
    while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
    return f?-res:res;
}
inline void fprint(int n)
{
    if(n<0){putchar('-');n=-n;}
    if(n>9) fprint(n/10);
    putchar(n%10+'0');
}
inline void print(int n)
{
    fprint(n);
    putchar('\n');
}   
const int N=30005;
const int k=10000;
int n,m,x,y,z,ans,res,cnt,block,len,a[N];
int l[k],r[k],pos[k];
vector<int>v[k];
signed main(void)
{
	rd(n);
	for(ri i=1;i<=n;++i) rd(a[i]);
	rd(m);
	block=sqrt(n); 
	for(ri i=1;i<=block+100;++i)
	{
		l[i]=r[i-1]+1;
		r[i]=i*block; 
	}
	if(r[block]<n) 
	{
		++block;
		l[block]=r[block-1]+1;
		r[block]=n; 
	}
	for(ri i=1;i<=block;++i) 
	{
		for(ri j=l[i];j<=r[i];++j)
		{
			pos[j]=i; 
			v[i].emplace_back(a[j]);
		}	
		sort(v[i].begin(),v[i].end());
	} 
	while(m--)
	{
		rd(x); rd(y); rd(z);
		if(x>y) swap(x,y);
		ans=0;
		if(pos[x]==pos[y])
		{
			for(ri i=x;i<=y;++i)
				if(a[i]>z) ++ans;
			print(ans);
			continue;
		}
		for(ri i=x;i<=r[pos[x]];++i) if(a[i]>z) ++ans;
		for(ri i=l[pos[y]];i<=y;++i) if(a[i]>z) ++ans;
		for(ri i=pos[x]+1;i<=pos[y]-1;++i)
		{ 
			auto it=upper_bound(v[i].begin(),v[i].end(),z);
			ri ts=it-v[i].begin();
			ts=(int)v[i].size()-ts;
			ans+=ts;
		}
		print(ans);
	}
	return 0;
}
/*
17
1 5 2 4 3 6 8 7 52 3 96 3 6 5 4 8 11
4
1 17 10
8 10 6
3 7 2
17 17 100
1 5 100
*/
2023/11/10 21:29
加载中...