【金牌导航】【暴力】区间不同树
题目
解题思路
对不起,本来应该打莫队的
结果暴力过了。。。
代码
#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
int x,y,id;
}f[100010];
int n,m,ans,a[100000],b[100000],cnt[100000];
bool cmp(lzf l,lzf y)
{
if (l.x!=y.x) return l.x<r.x;
return l.y<y.y;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&f[i].x,&f[i].y);
f[i].id=i;
}
sort(f+1,f+m+1,cmp); //按左边界从小到大排
int l=f[1].x,r=f[1].y;
for (int i=l;i<=r;i++)
{
if (!cnt[a[i]]) ans++;
cnt[a[i]]++;
}
b[f[1].id]=ans;
for (int i=2;i<=m;i++)
{
for (int i=l;i<f[i].x;i++)
{
if (cnt[a[i]]==1) ans--;
cnt[a[i]]--;
}
for (int i=r+1;i<=f[i].y)
{
if (!cnt[a[i]]) ans++;
cnt[a[i]]++;
}
b[f[i].id]=ans;
}
for (int i=1;i<=m;i++)
printf("%d",b[i]);
return 0;
}