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);
  }
}

 

posted @ 2021-08-11 20:57  废柴废柴少女  阅读(22)  评论(0)    收藏  举报