• 小z的袜子


    传送门

    题目描述

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……

    具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。

    你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子。当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择。

    然而数据中有L=R的情况,请特判这种情况,输出0/1。

    输入输出格式

    输入格式:

    输入文件第一行包含两个正整数N和M。N为袜子的数量,M为小Z所提的询问的数量。接下来一行包含N个正整数Ci,其中Ci表示第i只袜子的颜色,相同的颜色用相同的数字表示。再接下来M行,每行两个正整数L,R表示一个询问。

    输出格式:

    包含M行,对于每个询问在一行中输出分数A/B表示从该询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。若该概率为0则输出0/1,否则输出的A/B必须为最简分数。(详见样例)

    输入输出样例

    输入样例#1: 
    6 4
    1 2 3 3 3 2
    2 6
    1 3
    3 5
    1 6
    输出样例#1: 
    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。

    分析

    裸的莫队算法,用tot数组记录每一颜色的总数,不难算出:每增加一个某颜色袜子,配成一对同色袜子的情况增加(tot-1),减少时的情况相同。

    特别注意!!!:1ll要放在数的前面乘

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>

    using namespace std;
    int n,m,a[60000],belong[60000];
    long long ans[60000];
    struct node{
          int le,ri,no;
          long long num;
    }q[60000];
    int L=1,R;
    long long Ans;
    int block,sum;
    long long tot[60000];
    long long S[60000];

    bool cmp(const node &x,const node &y){
          if(belong[x.le]==belong[y.le])return x.ri<y.ri;
          return belong[x.le]<belong[y.le];
    }

    void add(int x){
          tot[a[x]]++;
          Ans+=tot[a[x]]-1;
    }

    void del(int x){
          tot[a[x]]--;
          Ans-=tot[a[x]];
    }

    long long gcd(long long a,long long b){
          if((a%b)==0)
            return b;
          return gcd(b,a%b);
    }

    int main()
    {     int i,j,k;
          cin>>n>>m;
          block=sqrt(n);
          sum=((n%block)==0?(n/block):(n/block+1));
          for(i=1;i<=n;i++){
              scanf("%d",&a[i]);
              belong[i]=(i-1)/block+1;
          }
          for(i=1;i<=m;i++){
              scanf("%d%d",&q[i].le,&q[i].ri);
              q[i].no=i;
              q[i].num=1ll*(q[i].ri-q[i].le+1)*(q[i].ri-q[i].le)/2;
          }
          sort(q+1,q+m+1,cmp);
          for(i=1;i<=m;i++){
              while(L<q[i].le){
                  del(L);
                  L++;
              }
              while(L>q[i].le){
                  L--;
                  add(L);
              }
              while(R>q[i].ri){
                  del(R);
                  R--;
              }
              while(R<q[i].ri){
                  R++;
                  add(R);
              }
              ans[q[i].no]=Ans;
              S[q[i].no]=q[i].num;
              if(q[i].le==q[i].ri)
                ans[q[i].no]=0,
                S[q[i].no]=1;
          }
          for(i=1;i<=m;i++){
              long long x=gcd(ans[i],S[i]);
              printf("%lld/%lld ",ans[i]/x,S[i]/x);
          }
          return 0;
    }

  • 相关阅读:
    day70 django中间件
    day69 cookie与session
    day68 form组件
    day67 前后端数据交互
    day65 django进阶(1)
    day64 django模型层
    day63 django入门(4)
    day62 作业
    Python正课142 —— DRF 进阶3 路由与认证
    一文搞懂什么是IaaS, PaaS和SaaS
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8353030.html
Copyright © 2020-2023  润新知