真的不错的题目
感觉我的离线预处理弱爆了!!!
还有我的树状数组也弱爆了!!
这个题首先需要
读入询问,离线处理,按照右端点排序。
记pre[i]为第i朵花前面,与i同色的最靠近i的花的位置,若不存在则pre[i]=0.
从1到i循环,到i 时,把树状数组中pre[pre[i]]+1~pre[i]这一段上的元素+1。然后询问以i为右端点的询问中,左端点在树状数组中的值即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 100009
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
int n,m,C,c[MAX],last[MAX],pre[MAX],f[MAX];
int t=1,ans[MAX];
struct wbysr
{
int l,r,id;
}a[MAX];
bool cmp(wbysr a1,wbysr a2)
{
//return a1.r==a2.r?a1.r<a2.r:a1.l<a2.l;
return a1.r<a2.r;
}
inline void insert(int x,int num)
{
for(int i=x;i>0;i-=i&-i)
c[i]+=num;
}
inline int ask(int x)
{
int s=0;
for(int i=x;i<=n;i+=(i&-i))
s+=c[i];
return s;
}
int main()
{
scanf("%d%d%d",&n,&C,&m);
rep(i,1,n)
scanf("%d",&f[i]),pre[i]=last[f[i]],last[f[i]]=i;
rep(i,1,m)
scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;
sort(a+1,a+1+m,cmp);
rep(i,1,n)
{
insert(pre[pre[i]],-1);
insert(pre[i],1);
while(a[t].r==i)
ans[a[t].id]=ask(a[t].l),t++;
}
rep(i,1,m)
printf("%d\n",ans[i]);
return 0;
}
还有我的树状数组也弱爆了!!
这个题首先需要
读入询问,离线处理,按照右端点排序。
记pre[i]为第i朵花前面,与i同色的最靠近i的花的位置,若不存在则pre[i]=0.
从1到i循环,到i 时,把树状数组中pre[pre[i]]+1~pre[i]这一段上的元素+1。然后询问以i为右端点的询问中,左端点在树状数组中的值即可。