求条
查看原帖
求条
753640
封禁用户楼主2024/7/19 16:00

0pts,过样例了。

#include<bits/stdc++.h>
#define sd std::
//#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=2e5+10;
struct seg_Tree//线段树
{
	int t[N<<2];
	#define ls k<<1
	#define rs k<<1|1
	void pushup(int k)
	{
		t[k]=t[ls]+t[rs];
	}
	void update(int k,int l,int r,int x,int v)
	{
		if(l==r)
		{
			t[k]+=v;
			return;
		}
		int mid=l+r>>1;
		if(x<=mid) update(ls,l,mid,x,v);
		else update(rs,mid+1,r,x,v);
		pushup(k);
	}
	int find(int k,int l,int r,int x)
	{
		if(t[k]==r-l+1) return -1;
		if(l==r) return r;
		int mid=l+r>>1;
		if(t[rs]!=r-mid&&x>mid) return find(rs,mid+1,r,x);
		else return find(ls,l,mid,x);
	}
	#undef val(k)
	#undef siz(k)
	#undef ls
	#undef rs
}T,TM;
struct query
{
	int l,r,id;
}q[N];
int n,m,Q,Z,t,size,a[N],b[N],pos[N],L[N],R[N],st[N],ans[N],vis[N];
int cmp(query a,query b)
{
	return pos[a.l]==pos[b.l]?a.r<b.r:pos[a.l]<pos[b.l];
}
il void add(int x)
{
	int tmp=st[x]==n+1?-1:T.find(1,1,n,st[x]);
	if(tmp!=-1) T.update(1,1,n,tmp,1),vis[x]=tmp;
}
il void del(int x)
{
	if(vis[x]) T.update(1,1,n,vis[x],-1),vis[x]=0;
} 
il void solve()
{
	n=read(),m=read(),Z=read();
	t=sqrt(m);size=m/t;
	F(i,1,size)
	{
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	if(R[size]<m)
	{
		++size;
		L[size]=R[size-1]+1;
		R[size]=m;
	}
	F(i,1,size) F(j,L[i],R[i]) pos[j]=i;
	F(i,1,n) a[i]=Z-read();
	sd sort(a+1,a+1+n,sd greater<int>());
	F(i,1,m)
	{
		b[i]=read(); 
		int l=1,r=n,res=n+1;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(a[mid]>=b[i]) l=mid+1,res=mid;
			else r=mid-1;
		}
		st[i]=res;
	}
	Q=read();
	F(i,1,Q) q[i].l=read(),q[i].r=read(),q[i].id=i;
	sd sort(q+1,q+1+Q,cmp);
	int l=1,r=0,last=0,__l;
	F(i,1,Q)
	{
		if(pos[q[i].l]==pos[q[i].r])//属于一个块
		{
			dbg(q[i].id);
			F(j,q[i].l,q[i].r)
			{
				int k=st[j]==n+1?-1:TM.find(1,1,n,st[j]);
				if(k!=-1) TM.update(1,1,n,k,1),vis[j]=k;
			}
			ans[q[i].id]=TM.t[1];
			F(j,q[i].l,q[i].r)
			{
				if(vis[j]) TM.update(1,1,n,vis[j],-1),vis[j]=0;
			}
			continue;
		}
		if(pos[q[i].l]!=last)
		{
			while(r>R[pos[q[i].l]]) del(r--);
			while(l<R[pos[q[i].l]]+1) del(l++);
			
			last=pos[q[i].l];
		}
		while(r<q[i].r) add(++r);
		__l=l;
		while(__l>q[i].l) add(--__l);
		ans[q[i].id]=T.t[1];
		while(__l<l) del(__l++);
	}
	F(i,1,Q) put(ans[i]);
}
int main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}
2024/7/19 16:00
加载中...