AC日记——[国家集训队2010]小Z的袜子 cogs 1775

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

思路:

  传说中的莫队算法(优雅的暴力);

  莫队算法是一个离线的区间询问算法;

  如果我们知道[l,r],

  那么,我们就能O(1)的时间求出(l-1,r),(l+1,r),(l,r-1),(l,r+1);

  莫队算法怎么保证时间呢?

  把询问排序;

  然后进行暴力;

  但是这样仍然需要很长很长的时间;

  所以,我们引入一个根号方法,分块;

  把区间的点分块;

  然后每个询问的l,r按l所属的块为第一关键字,l,r为第二第三;

  排序完后,就可以保证复杂度是O(n*sqrt(n));

  然后再看这个题目本身;

  询问l,r中的同种颜色袜子的概率;

  稍微思考一下便可列出式子:

    a1*(a1-1)+a2*(a2-1)+...+ai*(ai-1)/(r-l+1)*(r-l)

    ai为第i种颜色的个数;

  改变一下就可以得到:

    a1*a1+a2*a2+...+ai*ai-a1-a2-...-ai/(r-l+1)*(r-l)

  因为每种颜色袜子的总个数为r-l+1,所以:

    a1*a1+a2*a2+...+ai*ai-r+l-1/(r-l+1)*(r-l)

来,上代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 50005
#define ll long long

struct QueryType {
    ll l,r,id;
};
struct QueryType qu[maxn];

ll n,m,col[maxn],ans[maxn],pos=0,fa[maxn],num[maxn],bel[maxn],size;

inline void in(ll &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}

bool cmp(QueryType iposa,QueryType iposb)
{
    if(bel[iposa.l]==bel[iposb.l]) return iposa.r<iposb.r;
    else return iposa.l<iposb.l;
}

inline void updata(ll now,ll dis)
{
    now=col[now];
    pos-=num[now]*num[now];
    num[now]+=dis;
    pos+=num[now]*num[now];
}

ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}

int main()
{
    freopen("hose.in","r",stdin);
    freopen("hose.out","w",stdout);
    in(n),in(m);size=sqrt(n);
    for(ll i=1;i<=n;i++) in(col[i]),bel[i]=(i-1)/size;
    for(ll i=1;i<=m;i++) in(qu[i].l),in(qu[i].r),qu[i].id=i;
    sort(qu+1,qu+m+1,cmp);
    ll li=1,ri=0;
    for(ll j=1;j<=m;j++)
    {
        if(ri>qu[j].r) for(ll i=ri;i>qu[j].r;i--) updata(i,-1);
        else for(ll i=ri+1;i<=qu[j].r;i++) updata(i,1);
        if(li>qu[j].l) for(ll i=li-1;i>=qu[j].l;i--) updata(i,1);
        else for(ll i=li;i<qu[j].l;i++) updata(i,-1);
        ri=qu[j].r,li=qu[j].l,ans[qu[j].id]=pos-(ri-li+1);
        if(qu[j].r-qu[j].l>=2) fa[qu[j].id]=(ri-li+1)*(ri-li);
    }
    for(ll i=1;i<=m;i++)
    {
        if(fa[i]==0||ans[i]==0)
        {
            printf("0/1\n");
            continue;
        }
        ll o=gcd(fa[i],ans[i]);
        printf("%lld/%lld\n",ans[i]/o,fa[i]/o);
    }
    return 0;
}
时间: 2024-10-19 06:23:09

AC日记——[国家集训队2010]小Z的袜子 cogs 1775的相关文章

洛谷 1775. [国家集训队2010]小Z的袜子

1775. [国家集训队2010]小Z的袜子 ★★★   输入文件:hose.in   输出文件:hose.out   简单对比时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,

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

★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便

数据结构(莫队算法):国家集训队2010 小Z的袜子

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

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

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

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并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一