P1494 [国家集训队]小Z的袜子 莫队模板

6 4
1 2 3 3 3 2
2 6
1 3
3 5
1 6

2/5
0/1
1/1
4/15

说明

30%的数据中 N,M ≤ 5000；

60%的数据中 N,M ≤ 25000；

100%的数据中 N,M ≤ 50000，1 ≤ L < R ≤ N，Ci ≤ N。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 50005;
#define ll long long
struct Query{
int id, l, r, len;
}q[maxn];
ll Ans = 0;
ll tot[maxn], ans[maxn];
int c[maxn], a[maxn], pos[maxn], len[maxn];
bool cmp(Query a, Query b){
if(pos[a.l] == pos[b.l])
return a.r < b.r;
return pos[a.l] < pos[b.l];
}
Ans += c[val];
c[val]++;
}
void del(int val){
c[val]--;
Ans -= c[val];
}
ll gcd(ll a, ll b){
if(!b)return a;
return gcd(b, a%b);
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
int sz = ceil(sqrt(1.0*n));
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
tot[i] = tot[i-1] + i - 1;
pos[i] = (i-1) / sz;
}
for(int i = 1; i <= m; i++){
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
q[i].len = q[i].r - q[i].l + 1;
}
sort(q+1, q+1+m, cmp);
int L = 1, R = 0;
for(int i = 1; i <= m; i++){
if(q[i].l == q[i].r){
ans[q[i].id] = -1; continue;
}
while(R > q[i].r)del(a[R--]);
while(L < q[i].l)del(a[L++]);
ans[q[i].id] = Ans;
len[q[i].id] = q[i].len;
}
for(int i = 1; i <= m; i++)
if(ans[i] == -1)printf("0/1\n");
else{
ll t = gcd(ans[i], tot[len[i]]);
printf("%lld/%lld\n", ans[i]/t, tot[len[i]]/t);
}
}
View Code

P1494 [国家集训队]小Z的袜子 莫队模板

(0)
(0)

0条

© 2014 mamicode.com 版权所有 京ICP备13008772号-2