- 思路 :分块 思想 处理离线查询操作 对查询进行排序 在同一块内的按照 r 进行排序 不同块 的按照 L进行排序。
-
#include<bits/stdc++.h> using namespace std; #define maxn 56789 int n,m,col[maxn],cnt[maxn],l,r,zi,mu,len,B; struct node { int l,r,id; bool operator<(const node &c)const { return l/B==c.l/B?r<c.r:l<c.l; } } a[maxn]; struct op { int x,y; } ans[maxn]; void add(int x) { zi+=cnt[x]; ++cnt[x]; mu+=len; ++len; } void del(int x) { --cnt[x]; zi-=cnt[x]; --len; mu-=len; } int main() { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) scanf("%d",&col[i]); B=n/sqrt(m); for(int i=0; i<m; i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].id=i; } sort(a,a+m); r=zi=mu=len=0; l=1; for(int i=0; i<m; i++) { while(a[i].l<l) add(col[--l]); while(a[i].r<r) del(col[r--]); while(a[i].l>l) del(col[l++]); while(a[i].r>r) add(col[++r]); int g=__gcd(zi,mu); ans[a[i].id].x=zi/g; ans[a[i].id].y=mu/g; } for(int i=0; i<m; i++) printf("%d/%d\n",ans[i].x,ans[i].y); return 0; }
转载于:https://www.cnblogs.com/SDUTNING/p/10245265.html