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

来源:互联网 发布:肩膀酸痛知乎 编辑:程序博客网 时间:2024/06/02 23:54

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

Time Limit: 20 Sec  Memory Limit: 259 MB
Submit: 6944  Solved: 3191
[
Submit][Status][Discuss]

Description

作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……
具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。
你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子。当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择。

Input

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

Output

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

Sample Input

6 4
1 2 3 3 3 2
2 6
1 3
3 5
1 6

Sample Output

2/5
0/1
1/1
4/15
【样例解释】
询问1:共C(5,2)=10种可能,其中抽出两个2有1种可能,抽出两个3有3种可能,概率为(1+3)/10=4/10=2/5。
询问2:共C(3,2)=3种可能,无法抽到颜色相同的袜子,概率为0/3=0/1。
询问3:共C(3,2)=3种可能,均为抽出两个3,概率为3/3=1/1。
注:上述C(a, b)表示组合数,组合数C(a, b)等价于在a个不同的物品中选取b个的选取方案数。
【数据规模和约定】
30%的数据中 N,M ≤ 5000;
60%的数据中 N,M ≤ 25000;
100%的数据中 N,M ≤ 50000,1 ≤ L < R ≤ N,Ci ≤ N。

分析:根据组合的公式可以推出来只需要求区间内每个数出现次数的平方和
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define block 224#define maxn 50010#define ll long longll num[maxn];int a[maxn];int n,m;ll gcd(ll x,ll y){    while(x^=y^=x^=y%=x);    return y;}struct node{    int l,r,unit,id;    node(){}    node(int l,int r,int unit,int id): l(l),r(r),unit(unit),id(id) {}    inline bool operator < (const node &x) const    {        if(unit==x.unit) return r<x.r;        return unit<x.unit;    }}E[maxn];int l,r;ll res;ll x[maxn],y[maxn];void add(int x){    res-=num[x]*num[x];    num[x]++;    res+=num[x]*num[x];}void del(int x){    res-=num[x]*num[x];    num[x]--;    res+=num[x]*num[x];}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        for(int i=1;i<=m;i++)        {            scanf("%d%d",&l,&r);            E[i]=node(l,r,l/block,i);        }        sort(E+1,E+m+1);        for(int i=0;i<=n;i++) num[i]=0;        l=1,r=1,res=1;        num[a[1]]=1;        for(int i=1;i<=m;i++)        {            while(r<E[i].r)            {                r++;                add(a[r]);            }            while(r>E[i].r)            {                del(a[r]);                r--;            }            while(l<E[i].l)            {                del(a[l]);                l++;            }            while(l>E[i].l)            {                l--;                add(a[l]);            }            ll num1,num2,N;            N=E[i].r-E[i].l+1;            num1=res-N,num2=N*(N-1);            if(num1==0) x[E[i].id]=0,y[E[i].id]=1;            else            {                ll g=gcd(num1,num2);                x[E[i].id]=num1/g,y[E[i].id]=num2/g;            }        }        for(int i=1;i<=m;i++)            printf("%lld/%lld\n",x[i],y[i]);    }    return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 妈妈离婚又有一个孩子我该怎么办 孩子妈妈天天给孩子吃药我该怎么办 被像蚂蚁有翅膀的虫子咬了怎么办 1周半宝宝扭脚丫肿了怎么办 离婚后前夫带孩子走了找不到怎么办 宜昌全视之眼逃出卢浮宫怎么办 qq号被盗了密保手机也被改怎么办 乐视盒子控播平台认证怎么办 购买冲气娃娃被发现了怎么办 买了充气娃娃太美舍不得扔怎么办 一品官老爷账号密码忘了怎么办 苹果手机加声音显示出耳机怎么办 被删除的照片恢复后效果变差怎么办 w10系统玩刺激战场声音小怎么办 宝宝不咳嗽但是喉咙有痰怎么办 深圳限行如果车堵在路上怎么办 奔跑吧qq中奖我填写资料怎么办 微信之前绑定的手机号丢了怎么办 龙之谷手游换装备洗炼材料怎么办 小学生在班上碰到流氓同学怎么办 问道手游仓库密码忘了怎么办 问道手游安全码忘了怎么办 问道手游账号密码忘了怎么办 坐一天一夜长途车腰疼怎么办 智联的简历一直说不完整怎么办 智联招聘简历投错了怎么办 投简历的公司写错面试时怎么办 从原单位辞职后档案一直没提怎么办 手机因一些不良软件扣费怎么办 苹果手机玩崩坏3卡顿怎么办 以前很帅现在变得好难看了怎么办 偷了室友东西被发现了该怎么办 自己不喜欢狗但室友养狗怎么办 夏天身上闷热出很多小红豆怎么办? 海棠果核小孩吃进肚子了怎么办 大了叶海棠有点烂根怎么办? 刚栽的月季花苗叶子蔫了怎么办 对节白蜡盆景叶尖干枯发黑怎么办 婴儿皮肤被大人指甲划出血怎么办 三岁宝宝吃了铝箔包装纸怎么办 元宝鱼烂身子烂鳍尾巴怎么办