https://blog.csdn.net/Codeblocksm/article/details/52411928
https://www.cnblogs.com/zhgyki/p/9361822.html
代码1:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1000005;
int n,c,m;
int a[maxn],C[maxn];
int last[maxn],mp[maxn];
struct node
{
int l,r,id;
friend bool operator <(node a,node b)
{
return a.l<b.l;
}
}bk[maxn];
int res[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
for(int i=x;i<=n;i+=lowbit(i))
{
C[i]+=val;
}
}
int query(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
{
ans+=C[i];
}
return ans;
}
int main()
{
//cin>>n>>c>>m;
scanf("%d %d %d",&n,&c,&m);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
memset(last,0,sizeof(last));
for(int i=n;i>=1;i--)
{
mp[i]=last[a[i]];
last[a[i]]=i;
}
for(int i=1;i<=c;i++)
{
if(mp[last[i]])
add(mp[last[i]],1);
}
for(int i=0;i<m;i++)
{
int x,y;
//cin>>x>>y;
scanf("%d %d",&x,&y);
bk[i].l=x;
bk[i].r=y;
bk[i].id=i;
}
sort(bk,bk+m);
int pos=1;
for(int i=0;i<m;i++)
{
while(pos<bk[i].l)
{
if(mp[pos])
add(mp[pos],-1);
if(mp[mp[pos]])
add(mp[mp[pos]],1);
pos++;
}
res[bk[i].id]=query(bk[i].r)-query(bk[i].l-1);
}
for(int i=0;i<m;i++)
{
//cout << res[i] << endl;
printf("%d\n",res[i]);
}
return 0;
}
代码2:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1000005;
int n,c,m;
int a[maxn],C[maxn];
int last[maxn],mp[maxn];
struct node
{
int l,r,id;
friend bool operator <(node a,node b)
{
return a.r<b.r;
}
}bk[maxn];
int res[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
for(int i=x;i<=n;i+=lowbit(i))
{
C[i]+=val;
}
}
int query(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
{
ans+=C[i];
}
return ans;
}
int main()
{
//cin>>n>>c>>m;
scanf("%d %d %d",&n,&c,&m);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
int x,y;
//cin>>x>>y;
scanf("%d %d",&x,&y);
bk[i].l=x;
bk[i].r=y;
bk[i].id=i;
}
sort(bk,bk+m);
int pos=1;
for(int i=0;i<m;i++)
{
for(int j=pre;j<=bk[i].r;j++)
{
if(mp[a[j]])//看前面位置是否出现当前这个数值
add(mp[a[j]],-1);
add(j,1);
mp[a[j]]=j;
}
pre=bk[i].r+1;
res[bk[i].id]=query(bk[i].r)-query(bk[i].l-1);
}
for(int i=0;i<m;i++)
{
//cout << res[i] << endl;
printf("%d\n",res[i]);
}
return 0;
}