P1494 [国家集训队]小Z的袜子
题目:
https://www.luogu.com.cn/problem/P1494
维护总方案数,和每多一双袜子和没少一双袜子带来的贡献
#include<bits/stdc++.h> #include<stdio.h> using namespace std; const int maxn=5e4+7; int n,m,block,belong[maxn],arr[maxn],has[maxn],ans[maxn]; inline int gcd(int a, int b) { int r; while (b > 0) { r = a % b; a = b; b = r; }return a; } struct Q { int l,r,id; bool operator <(const Q &b) { if(belong[l]!=belong[b.l]) return l<b.l; else return r<b.r; } }query[maxn]; int L,R; pair<int,int> ret; int sum=0; inline void add(int x) { // ret-=has[x]*has[x]; ret.first+=has[x]; ++has[x]; ret.second+=sum; sum++; } inline void del(int x) { sum--; --has[x]; ret.first-=has[x]; ret.second-=sum; } //从[L,R]转移到[l,r] /* void GetNew(int l,int r,int L,int R) { while(R<r) add(arr[++R]); while(L>l) add(arr[--L]); while(R>r) del(arr[R--]); while(L<l) del(arr[L++]); } */ int main() { scanf("%d%d",&n,&m); block=sqrt(n); for(int i=1;i<=n;++i) { scanf("%d",&arr[i]); belong[i]=(i-1)/block+1; } int cnt=0; pair<int,int> ans[maxn]; for(int i=1;i<=m;++i) { int l,r; scanf("%d%d",&l,&r); if(l==r) { ans[i].first=0; ans[i].second=1; } else query[++cnt]={l,r,i}; } sort(query+1,query+cnt+1); L=1; for(int i=1;i<=cnt;++i) { int l=query[i].l; int r=query[i].r; int id=query[i].id; //auto[l,r,id]=query[i]; while(R<r) add(arr[++R]); while(L>l) add(arr[--L]); while(R>r) del(arr[R--]); while(L<l) del(arr[L++]); ans[id].first=ret.first; ans[id].second=ret.second; } for(int i=1;i<=m;++i) { int y=gcd(ans[i].first,ans[i].second); int a=ans[i].first/y; int b=ans[i].second/y; if(a==0) printf("0/1\n"); else printf("%d/%d\n",a,b); } }
浙公网安备 33010602011771号