zoukankan      html  css  js  c++  java
  • BZOJ 2038 小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。

    莫队裸题,练手用

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long lol;
     8 struct Data
     9 {
    10   int l,r,id;
    11 }q[50001];
    12 lol sum,ans[50001],tot[50001];
    13 int col[50001],lim,n,m,a[50001];
    14 bool cmp(Data a,Data b)
    15 {
    16   if (a.l/lim==b.l/lim)
    17     return a.r<b.r;
    18   return a.l<b.l;
    19 }
    20 lol gcd(lol a,lol b)
    21 {
    22   if (!b) return a;
    23   return gcd(b,a%b);
    24 }
    25 int main()
    26 {int i,j;
    27   lol d;
    28   cin>>n>>m;
    29   lim=sqrt(n);
    30   for (i=1;i<=n;i++)
    31     scanf("%d",&col[i]);
    32   for (i=1;i<=m;i++)
    33     {
    34       scanf("%d%d",&q[i].l,&q[i].r);
    35       q[i].id=i;
    36       tot[i]=1ll*(q[i].r-q[i].l)*(q[i].r-q[i].l+1)/2;
    37     }
    38   sort(q+1,q+m+1,cmp);
    39   int L=1,R=0;
    40   sum=0;
    41   for (i=1;i<=m;i++)
    42     {
    43       int l=q[i].l,r=q[i].r;
    44       while (L<l) sum-=--a[col[L++]];
    45       while (L>l) sum+=a[col[--L]]++;
    46       while (R<r) sum+=a[col[++R]]++;
    47       while (R>r) sum-=--a[col[R--]];
    48       ans[q[i].id]=sum;
    49     }
    50   for (i=1;i<=m;i++)
    51     {
    52       if (ans[i]==0||tot[i]==0)
    53     printf("0/1
    ");
    54       else
    55     {
    56       d=gcd(ans[i],tot[i]);
    57       printf("%lld/%lld
    ",ans[i]/d,tot[i]/d);
    58     }
    59     }
    60 }
  • 相关阅读:
    第二十一天作业
    第二十天:继承
    第二十天作业
    第十六天
    第十九天作业
    day53
    day52
    day51
    day50
    day44
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8475441.html
Copyright © 2011-2022 走看看