标签:pen cpp inf tchar space bool 不同 i++ ring
上次czy在机房妥善安排了他的后宫之后,他发现可以将他的妹子分为c种,他经常会考虑这样一个问题:在[l,r]
的妹子中间,能挑选出多少不同类型的妹子呢?注意:由于czy非常丧尸,所以他要求在所挑选的妹子类型在[l,r]
中出现次数为正偶数,你懂得。问题简述:n个数,m次询问,每次问[l,r]区间有多少个数恰好出现正偶数次
Input
第一行3个整数,表示n,c,m
第二行n个数,每个数Ai在[1,c]之间,表示一个Ai类型的妹子
接下来m行,每行两个整数l,r,表示询问[l,r]这个区间的答案
n,m=50000,80000,100000,c=100000
数据保证随机生成
Output
有m行,表示第i次询问的答案
Sample Input
5 5 3
1 1 2 2 3
1 5
3 4
2 3
Sample Output
2
1
0
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n,c,m,block; int a[100005],belong[100005]; int tmp[100005]; struct data{int l,r,ans,id;}q[100005]; inline bool operator<(data a,data b) { return (belong[a.l]<belong[b.l])||(belong[a.l]==belong[b.l]&&a.r<b.r); } inline bool cmp(data a,data b) { return a.id<b.id; } void solve() { int l=0,r=0; int ans=0; for(int i=1;i<=m;i++) { while(r<q[i].r) { r++; tmp[a[r]]++; if(tmp[a[r]]%2==0)ans++; if(tmp[a[r]]%2==1&&tmp[a[r]]!=1)ans--; } while(l>q[i].l) { l--; tmp[a[l]]++; if(tmp[a[l]]%2==0)ans++; if(tmp[a[l]]%2==1&&tmp[a[l]]!=1)ans--; } while(l<q[i].l) { tmp[a[l]]--; if(tmp[a[l]]%2==0&&tmp[a[l]]!=0)ans++; if(tmp[a[l]]%2==1)ans--; l++; } while(r>q[i].r) { tmp[a[r]]--; if(tmp[a[r]]%2==0&&tmp[a[r]]!=0)ans++; if(tmp[a[r]]%2==1)ans--; r--; } q[i].ans=ans; } } int main() { //freopen("harem.in","r",stdin); //freopen("harem.out","w",stdout); n=read();c=read();m=read(); block=(int)sqrt((double)n); for(int i=1;i<=n;i++)belong[i]=(i-1)/block+1; for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i; sort(q+1,q+m+1); solve(); sort(q+1,q+m+1,cmp); for(int i=1;i<=m;i++) printf("%d\n",q[i].ans); return 0; }
标签:pen cpp inf tchar space bool 不同 i++ ring
原文地址:https://www.cnblogs.com/cutemush/p/12861458.html