题意:给你n个人,每个人穿着有颜色的衣服,现在给你m次查询,每次查询一个区间,这个区间有多少对人的衣服颜色是相同的。
思考:
昨天做题没看,今天一看就是莫队裸题,而且时间限制还5秒,衣服的颜色相同就是某种颜色的人数/2就是匹配的对数。
代码:
struct Node{
int l,r;
int id;
}node[N];
int T,n,m,k;
int va[N];
int pos[N],cnt[N],siz;
int anw[N],ans;
bool cmp(Node A,Node B)
{
if(pos[A.l]!=pos[B.l]) return pos[A.l]<pos[B.l];
return A.r<B.r;
}
void add(int x)
{
ans -= cnt[va[x]]/2;
cnt[va[x]]++;
ans += cnt[va[x]]/2;
}
void sub(int x)
{
ans -= cnt[va[x]]/2;
cnt[va[x]]--;
ans += cnt[va[x]]/2;
}
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i];
cin>>m;
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
node[i] = {l,r,i};
}
siz = sqrt(n);
for(int i=1;i<=n;i++) pos[i] = i/siz;
sort(node+1,node+1+m,cmp);
int l = 1,r = 0;
for(int i=1;i<=m;i++)
{
while(node[i].l<l) add(--l);
while(node[i].r>r) add(++r);
while(node[i].l>l) sub(l++);
while(node[i].r<r) sub(r--);
anw[node[i].id] = ans;
}
for(int i=1;i<=m;i++) cout<<anw[i]<<"\n";
return 0;
}
总结:
多多看看题什么的。