传送门

题目描述

作为一个生活散漫的人,小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\n",ans[i]/x,S[i]/x);
      }
      return 0;
}

小z的袜子的更多相关文章

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  3. 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  4. BZOJ-2038 小Z的袜子(hose) 莫队算法

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 5573 Solved: 2568 [Subm ...

  5. 清橙 A1206 小Z的袜子(莫队算法)

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:1357   AC次数:406   平均分:46.75   将本题分享到:        查看未格式化的试题 ...

  6. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  7. BZOJ2038小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2343  Solved: 1077[Subm ...

  8. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  9. BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 3577  Solved: 1652[Subm ...

  10. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

随机推荐

  1. Hyperledger Fabric Model——超级账本组成模型

    超级账本组成模型 本文主要讲述Hyperledger Fabric的关键设计特性,并细述如何实现了一个全面的.可定制的企业级区块链解决方案: 资产定义--资产这里理解为任何具有货币价值的东西,它们都可 ...

  2. 获取tranform参数函数的封装

    平时我们都会去获取元素的各种属性值,例如宽高等等的值!但是tranform是个让人很头疼的点,获取出来的是矩阵,耐何线性代数学的并不是那么6啊. 解决方法的思路:只能采取有点取巧的方法,在我们设置的时 ...

  3. C陷阱:求数组长度

    // 这是一篇导入进来的旧博客,可能有时效性问题. 程序中,当我们建立了一个int型数组:int a[]={1,2,3,4,5,6};随后我们可能需要知道它的长度,此时可以用这种方法:length = ...

  4. 《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解

    上一篇我们详细解释了一下SrpingMVC的执行流程以及一些默认的配置,在Spring的思想中,就是默认大于配置.今天我们来详细的研究一下DispatcherServlet的url-pattern配置 ...

  5. deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I 听课笔记

    这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...

  6. 信息学奥赛一本通算法(C++版)基础算法:高精度计算

    高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...

  7. Codeforces__Raising Bacteria

    题目传送门:Raising Bacteria //问题描述:一个盒子里面放一个细菌在一天可以增生两个细菌. 现在已知盒子里面细菌的个数,问你最初放多少个细菌可以增生盒子里面的细菌数量 //输入:盒子中 ...

  8. gulp + es6 + babel+ angular 搭建环境并实现简单的路由

    1.ECMAscript 6的语法糖面临的唯一问题就是浏览器兼容的问题,使得很多程序员望而怯步. 2.babel的作用就是将es6的语法编译成es5被浏览器所识别.这样就可以任性的使用es6了. 3. ...

  9. cesium编程入门(五)绘制形状

    通过Entity添加形状 先来看一个添加立方体的例子 var viewer = new Cesium.Viewer('cesiumContainer'); var redBox = **viewer. ...

  10. IDEA安装vue开发插件

    前言: 开发免不了要用到开发工具,什么sublime,webstorm,idea的,现在我就说下idea开发神器下安装vue插件进行vue项目的开发吧. idea下载地址:http://www.jet ...