#42. czy的后宫3
1.题意:
2.题解:
疯了,怎么都提交不了,是不是oj删题了???
莫队轻松解决,分块写代码就有点复杂了
区间出现正偶数次的数的个数
3.ac代码:
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int f[5002][5002];
const int INF=0x3f3f3f3f;
int a[N];
int cnt[N];
int ans;
int res[N];
int sq;
struct Node{
int l,r,id;
operator <(const Node &o)const{
if(l/sq!=o.l/sq) return l<o.l;
if(l/sq&1) return r<o.r;
return r>o.r;
}
}node[N];
void add(int i){
cnt[a[i]]++;
if(cnt[a[i]]%2==0&&cnt[a[i]]) ans++;
if(cnt[a[i]]%2==1&&cnt[a[i]]!=1) ans--;
}
void del(int i){
cnt[a[i]]--;
if(cnt[a[i]]%2==0&&cnt[a[i]]!=0) ans++;
if(cnt[a[i]]%2==1) ans--;
}
int main(){
int n,c,m;
cin>>n>>c>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sq=sqrt(n);
//int l,r;
for(int i=1;i<=m;i++){
cin>>node[i].l>>node[i].r;
node[i].id=i;
}
sort(node+1,node+1+m);
int l=1,r=0;
for(int i=1;i<=m;i++){
//l,r是闭区间,包含在内,所以增加时先++/--,减少时先传入l,r再加减
while(l<node[i].l){
del(l++);
}
while(l>node[i].l){
add(--l);
}
while(r<node[i].r){
add(++r);
}
while(r>node[i].r){
del(r--);
}