【luogu P1494 [国家集训队]小Z的袜子】 题解

题目链接:https://www.luogu.org/problemnew/show/P1494

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn =  50000+10;
inline long long read()
{
    long long k=0;
    char c;
    c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c)){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    return k;
}
long long n, m, bl, answer, curL = 1, curR = 0, cnt[maxn], a[maxn], gg;

struct query{
    long long p, l, r;
}e[maxn];

struct answers{
    long long x, y;
}ans[maxn], now;

long long gcd(long long x, long long y)
{
    if(x%y == 0) return y;
    else return gcd(y,x%y);
}

bool cmp(query a, query b)
{
    return (a.l/bl) == (b.l/bl) ? a.r < b.r : a.l < b.l;
}

void add(long long pos)
{
    cnt[a[pos]]++;
    if(cnt[a[pos]] > 1)
    now.x = now.x + cnt[a[pos]]*(cnt[a[pos]]-1)-(cnt[a[pos]]-1)*(cnt[a[pos]]-2);

}

void remove(long long pos)
{
    cnt[a[pos]]--;
    if(cnt[a[pos]] > 0)
    now.x = now.x + cnt[a[pos]]*(cnt[a[pos]]-1)-(cnt[a[pos]]+1)*cnt[a[pos]];
}

int main()
{
    n = read(); m = read();

    bl = sqrt(n);

    for(long long i = 1; i <= n; i++)
    a[i] = read();

    for(long long i = 1; i <= m; i++)
    {
        e[i].l = read(); e[i].r = read(); e[i].p = i;
    }

    sort(e+1,e+1+m,cmp);

    for(long long i = 1; i <= m; i++)
    {
        long long L = e[i].l, R = e[i].r;
        while(curL < L)
            remove(curL++);
        while(curL > L)
            add(--curL);
        while(curR < R)
            add(++curR);
        while(curR > R)
            remove(curR--);
        now.y = (e[i].r-e[i].l+1)*(e[i].r-e[i].l);
        if (!now.x)
        {
            now.x=0;
            now.y=1;
        }
        gg = gcd(now.x, now.y);
        ans[e[i].p].x = now.x/gg;
        ans[e[i].p].y = now.y/gg;
    }
    for(long long i = 1; i <= m; i++)
    printf("%lld/%lld\n",ans[i].x,ans[i].y);
    return 0;
}

原文地址:https://www.cnblogs.com/MisakaAzusa/p/9061487.html

时间: 2024-07-28 21:50:50

【luogu P1494 [国家集训队]小Z的袜子】 题解的相关文章

P1494 [国家集训队]小Z的袜子 莫队模板

链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜色相

P1494 [国家集训队]小Z的袜子

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

P1494 [国家集训队]小Z的袜子(莫队)

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

P1494 [国家集训队]小Z的袜子(莫队算法)

莫队板子 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define int long long using namespace std; struct Query{ int l,r,aid; }query[55000]; int ansa[55000],ansb[55000],c[55000],blocknum,midans,sz,belong[

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

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只

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

[算法]莫队 [题解] BZOJ 2038 2009国家集训队 小Z的袜子(hose) 莫队算法 莫队--讲稿? 施工中--

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

莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) ------------------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 50009; int N,

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

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10239  Solved: 4659[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命--具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

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

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9472  Solved: 4344 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一