BZOJ 3524:[POI2014]KUR-Couriers

很裸的板子题。
就当把模板打得熟练点罢了。
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,q,m,x,y,t,cnt;
int a[N],b[N],ll[N<<5],rr[N<<5],sum[N<<5],T[N<<5];

int build(int l,int r)
{
	int rt=++cnt;
	ll[rt]=rr[rt]=sum[rt]=0;
	if (l<r)
	{
		int mid=l+r>>1;
		ll[rt]=build(l,mid);
		rr[rt]=build(mid+1,r);
	}
	return rt;
}

int change(int pre,int l,int r,int x)
{
	int rt=++cnt;
	ll[rt]=ll[pre]; rr[rt]=rr[pre]; sum[rt]=sum[pre]+1;
	if (l<r)
	{
		int mid=l+r>>1;
		if (x<=mid) ll[rt]=change(ll[pre],l,mid,x);
		else rr[rt]=change(rr[pre],mid+1,r,x); 
	}
	return rt;
}

int query(int u,int v,int l,int r,int x)
{
	if (l==r) return l;
	int mid=l+r>>1;
	if (2*(sum[ll[v]]-sum[ll[u]])>x) return query(ll[u],ll[v],l,mid,x);
	if (2*(sum[rr[v]]-sum[rr[u]])>x) return query(rr[u],rr[v],mid+1,r,x);
	return 0;
}

int main(){
	scanf("%d%d",&n,&q);
	for (register int i=1; i<=n; ++i) scanf("%d",&a[i]),b[i]=a[i];
	sort(a+1,a+n+1);
	m=unique(a+1,a+n+1)-a-1;
	T[0]=build(1,m); 
	for (register int i=1; i<=n; ++i)
	{
		t=lower_bound(a+1,a+m+1,b[i])-a;
		T[i]=change(T[i-1],1,m,t);
	}
	while (q--)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",query(T[x-1],T[y],1,m,y-x+1));
	}
return 0;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值