小Z的袜子(hose) HYSBZ

来源:互联网 发布:战地4枪械数据解析 编辑:程序博客网 时间:2024/06/11 08:25

作为一个生活散漫的人,小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 41 2 3 3 3 22 61 33 51 6

Sample Output

2/50/11/14/15

假设有c1,c2,c3……几种袜子,数量分别为a1,a2,a3……,则可以推出公式:
这里写图片描述
化简可得到:
这里写图片描述
接下来就是莫队算法模板了

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 1e5;LL len_block;struct node {    LL l, r, id, block;    node(){}    node(LL l,LL r,LL id):l(l),r(r),id(id) {        block = l / len_block;    }}query[maxn];struct ans {    LL a, b;    ans() {}    ans(LL a, LL b) :a(a), b(b) {}}anss[maxn];LL a[maxn], sum[maxn],up=1;LL gcd(LL a, LL b){    return b ? gcd(b, a%b) : a;}bool cmp(node a, node b){    if (a.block == b.block) return a.r < b.r;    return a.block < b.block;}inline void change(LL x,int add){    up -= sum[x] * sum[x];    sum[x]+=add;    up += sum[x] * sum[x];}inline LL in(){    LL ret = 0;    char ch;    while (ch = getchar(), ch<'0' || ch>'9');    while (ch >= '0'&&ch <= '9') {        ret = ret * 10 + ch - '0';        ch = getchar();    }    return ret;}inline void out(LL x){    if (x > 9) out(x / 10);    putchar(x % 10 + '0');}int main(){    int m, n;    while (~scanf("%d%d", &n, &m)) {        len_block = (LL)sqrt(n);        memset(sum, 0, sizeof sum);        for (int i = 1; i <= n; i++) a[i]=in();        for (int i = 1; i <= m; i++) {            LL l, r;            l = in(); r = in();            query[i] = node(l, r, i);        }        sort(query + 1, query + m + 1, cmp);        LL l = 1, r = 1;        sum[a[1]]++;        for (int i = 1; i <= m; i++) {            node &qr = query[i];            while (r < qr.r) change(a[++r], 1);            while (l > qr.l) change(a[--l], 1);            while (r > qr.r) change(a[r--], -1);            while (l < qr.l) change(a[l++], -1);            anss[qr.id] = ans(up - qr.r + qr.l - 1, (qr.r - qr.l + 1)*(qr.r - qr.l));        }        for (int i = 1; i <= m; i++) {            if (anss[i].a == 0) puts("0/1");            else {                LL g = gcd(anss[i].a, anss[i].b);                out(anss[i].a / g); putchar('/');                out(anss[i].b / g); putchar('\n');            }        }    }    return 0;}

莫队算法的关键在于可以利用区间[L,R]的信息,在O(1)的操作内推出区间[L,R+1],[L-1,R],[L-1,R-1]的信息。莫队算法比线段树更好写,代码也简短,能够满足大部分无修改的区间询问操作。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 考研团员档案丢了怎么办 学生的档案丢了怎么办 大四团员证丢了怎么办 2岁宝宝吸收不好怎么办 孩子逆反心理特强沟通不了怎么办 一年级孩子有逆反心里怎么办 如果一个学生会部门没人留怎么办 如果学生会部门很少人报名怎么办 职场说错话了我该怎么办? 中考通知书收到两份怎么办 高三学生英语差怎么办 论文查重百分之0怎么办 微信红包发错人了怎么办 文学社在社团活动日可以怎么办 小孩玩游戏瞎花钱怎么办 党员不配合纪检调查工作怎么办 新同事老问问题怎么办 白色衣服染红色了怎么办 左腿膝盖内侧疼怎么办 差二本线几分怎么办 吃错东西了想吐怎么办 玩游戏扣的话费怎么办 转笔实在是不会怎么办 滑板l轴承沾水了怎么办 暗影格斗3闪退怎么办 暗影格斗3文档被删怎么办 dnf手残党偷学技能学不了怎么办 打篮球没热身膝盖酸痛是怎么办 无线路由器lan口少怎么办? 电脑ip设置乱了怎么办 监控拍我我偷钱怎么办 网吧上网密码忘记了怎么办 比熊犬晚上叫怎么办 刚买的狗一直叫怎么办 酒驾罚款2年没交怎么办 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办 出车祸人不赔钱怎么办 交通事故对方保险不签字怎么办 肇事车主联系不上怎么办