求助莫队
查看原帖
求助莫队
288716
lzqy_楼主2021/7/14 20:05

rt,写的是莫队+vector,看题解也有这样做的,可能写假了?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000010;
inline int read()
{
	register int x=0;
	register char c=getchar();
	for(;!(c>='0'&&c<='9');c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+c-'0';
	return x;
}
int n,Q,qn;
int a[maxn];
vector<int>v;
struct p
{
	int x,y,k,h,ans;
}q[maxn];
bool cmp1(p a,p b)
{
	if((a.x-1)/qn+1==(b.x-1)/qn+1)
		return (a.y-1)/qn+1<(b.y-1)/qn+1;
	return (a.x-1)/qn+1<(b.x-1)/qn+1;
}
bool cmp2(p a,p b)
{
	return a.h<b.h;
}
signed main()
{
	n=read(),Q=read(),qn=sqrt(n);
	for(register int i=1;i<=n;i++)
		a[i]=read();
	for(register int i=1;i<=Q;i++)
		q[i].h=i,q[i].x=read(),q[i].y=read(),q[i].k=read();
	sort(q+1,q+1+Q,cmp1);
	for(register int i=q[1].x;i<=q[1].y;i++)
		v.insert(lower_bound(v.begin(),v.end(),a[i]),a[i]);
	if(q[1].k<=q[1].y-q[1].x+1)
		q[1].ans=v[q[1].k-1];
	else 
		q[1].ans=1;
	register int l=q[1].x,r=q[1].y;
	for(register int i=2;i<=Q;i++)
	{
		while(l>q[i].x) 
			l--,v.insert(lower_bound(v.begin(),v.end(),a[l]),a[l]);
		while(r<q[i].y) 
         	r++,v.insert(lower_bound(v.begin(),v.end(),a[r]),a[r]);
		while(l<q[i].x) 
			v.erase(lower_bound(v.begin(),v.end(),a[l])),l++;
		while(r>q[i].y) 
			v.erase(lower_bound(v.begin(),v.end(),a[r])),r--;
		if(q[i].k<=q[i].y-q[i].x+1)
			q[i].ans=v[q[i].k-1];
		else 
			q[i].ans=1;
	}
	sort(q+1,q+1+Q,cmp2);
	for(register int i=1;i<=Q;i++)
		printf("%d\n",q[i].ans);
	return 0;
} 

求帮忙看看,如果是被卡常了,劳烦给些卡常建议/kel

2021/7/14 20:05
加载中...