G - Range Pairing Query
(莫队板子)
题意:每次询问求出[l, r]这个区间内最多可以组成多少对颜色相同的人
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10 ;
int a[N] , cnt[N] , res ,len ,ans[N];
int n , q ;
template<typename T>inline void read(T &a) {
char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
struct node{
int id , l, r ;
}all[N];
bool cmp(node a , node b) {
if(a.l / len != b.l / len ) return a.l < b.l ;
return a.r < b.r ;
}
void add(int id ){
res -= cnt[a[id]] / 2 ;
cnt[a[id]] ++ ;
res += cnt[a[id]] / 2 ;
}
void de(int id ) {
res -= cnt[a[id]] / 2 ;
cnt[a[id]] -- ;
res += cnt[a[id]] / 2 ;
}
int main(){
read(n);
len = sqrt(n) ;
for(int i = 1 ; i <= n ; i++ ) read(a[i]);
read(q) ;
for(int i = 1 ; i <= q ; i ++ ) {
int l ,r ;
read(l) , read(r) ;
all[i] = {i , l, r } ;
}
sort(all + 1 , all + 1 + q , cmp) ;
int ll = 1 , rr = 0 ;
for(int i = 1 ; i<= q ; i ++ ) {
int id = all[i].id , l = all[i].l , r = all[i].r ;
while(ll > l ) add(-- ll) ;
while(ll < l ) de(ll ++ ) ;
while(rr < r ) add(++ rr) ;
while(rr > r ) de(rr -- ) ;
ans[id] = res ;
}
for(int i = 1 ; i <= q ; i ++ ) cout<<ans[i] <<"\n" ;
return 0 ;
}