【洛谷P4113】采花 HH的项链+

题目大意:静态统计序列区间中出现次数大于等于 2 的颜色数。

题解:类似于HH的项链,只需将 i 和 pre[i] 的关系对应到 pre[i] 和 pre[pre[i]] 的关系即可。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;

inline int read(){
	int x=0,f=1;char ch;
	do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
	do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
	return f*x;
}

int n,m,lim,t[maxn],cor[maxn],pre[maxn],ans[maxn],h[maxn];
struct rec{int l,r,id;}q[maxn];
bool cmp(const rec &a,const rec &b){return a.r<b.r;}
inline int lowbit(int x){return x&-x;}
void modify(int pos,int val){
	if(!pos)return;
	for(int i=pos;i<=n;i+=lowbit(i))t[i]+=val;
}
int query(int pos){
	int res=0;
	for(int i=pos;i;i-=lowbit(i))res+=t[i];
	return res;
}

void solve(){
	n=read(),lim=read(),m=read();
	for(int i=1;i<=n;i++)cor[i]=read();
	for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=n;i++)pre[i]=h[cor[i]],h[cor[i]]=i;
	for(int i=1,j=1;i<=m;i++){
		for(;j<=q[i].r;j++)modify(pre[pre[j]],-1),modify(pre[j],1);
		ans[q[i].id]=query(q[i].r)-query(q[i].l-1);
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

int main(){
	solve();
	return 0;	
} 
posted @ 2019-02-28 16:53  shellpicker  阅读(138)  评论(0编辑  收藏  举报