1 条题解
-
0赵青海 (huhe) LV 7 SU @ 2021-8-8 0:22:43
C++ :
#include<bits/stdc++.h> using namespace std; #define LL long long const int N = 50005; int n,m,c[N]; LL s[N],ans; struct node{ int l,r,id; int pos; LL a,b; }p[N]; LL gcd(LL x,LL y){return !y?x:gcd(y,x%y);} bool cmp(node a,node b){ if(a.pos == b.pos ) return a.r < b.r; return a.pos < b.pos; } bool cmp_id(node a,node b){ return a.id < b.id; } void update(int p,int add){ ans -= s[c[p]]*s[c[p]]; s[c[p]] += add; ans += s[c[p]]*s[c[p]]; } void solve(){ for(int i=1,l=1,r=0;i<=m;i++){ while(r < p[i].r){update(r+1,1);r++;} while(r > p[i].r){update(r,-1);r--;} while(l < p[i].l){update(l,-1);l++;} while(l > p[i].l){update(l-1,1);l--;} if(p[i].l == p[i].r){ p[i].a = 0; p[i].b = 1; continue; } p[i].a = ans - (p[i].r - p[i].l + 1); p[i].b = (p[i].r - p[i].l + 1) * 1LL * (p[i].r - p[i].l); LL g = gcd(p[i].a,p[i].b); p[i].a /= g; p[i].b /= g; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&c[i]); int len = sqrt(n); for(int i=1;i<=m;i++){ scanf("%d%d",&p[i].l,&p[i].r); p[i].id = i; p[i].pos = p[i].l / len; } sort(p+1,p+m+1,cmp); solve(); sort(p+1,p+m+1,cmp_id); for(int i=1;i<=m;i++) printf("%lld/%lld\n",p[i].a,p[i].b); return 0; }
- 1
信息
- ID
- 162
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 5
- 上传者