zoukankan      html  css  js  c++  java
  • BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038

    题意概括:

    有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机拿两只袜子,拿到相同颜色袜子的概率是多少。

    解题思路:

    莫队算法经典题,暴力找出区间内相同颜色的袜子的个数,排列组合最后得出结果。

    入门题,当模版。

    AC code:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cmath>
     5 #define LL long long
     6 using namespace std;
     7 
     8 const int MAXN = 5e4+10;
     9 int pos[MAXN], c[MAXN];
    10 LL s[MAXN], res;
    11 int N, M, L = 1, R = 0;
    12 
    13 LL gcd(LL a, LL b){return b==0?a:gcd(b, a%b);}
    14 LL sqr(LL x){return x*x;}
    15 struct date{
    16     int l, r, id;
    17     LL so, mo;
    18 }q[MAXN];
    19 bool cmp(date a, date b){
    20     if(pos[a.l]==pos[b.l]) return a.r < b.r;
    21     return a.l < b.l;
    22 }
    23 bool CMP(date a, date b){
    24     return a.id < b.id;
    25 }
    26 void Update(int x, int add)
    27 {
    28     //res-=sqr(s[c[x]]);
    29     res-=s[c[x]]*s[c[x]];
    30     s[c[x]]+=add;
    31     res+=s[c[x]]*s[c[x]];
    32     //res+=sqr(s[c[x]]);
    33 }
    34 
    35 int main()
    36 {
    37     scanf("%d%d", &N, &M);
    38     int sz = sqrt(N);
    39     for(int i = 1; i <= N; i++){
    40         scanf("%d", &c[i]);
    41         //pos[i] = (i-1)/sz+1;
    42         pos[i] = i/sz;
    43     }
    44     for(int i = 1; i <= M; i++){
    45         scanf("%d%d", &q[i].l, &q[i].r);
    46         q[i].id = i;
    47     }
    48     sort(q+1, q+M+1, cmp);
    49     for(int i = 1; i <= M; i++){
    50         while(R < q[i].r){R++; Update(R, 1);}
    51         while(R > q[i].r){Update(R, -1); R--;}
    52         while(L < q[i].l){Update(L, -1); L++;}
    53         while(L > q[i].l){L--; Update(L, 1);}
    54         if(q[i].l == q[i].r){
    55             q[i].so = 0;q[i].mo = 1;
    56             continue;
    57         }
    58         q[i].so = res-(q[i].r-q[i].l+1);
    59         q[i].mo = (LL)(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
    60         LL k = gcd(q[i].so, q[i].mo);
    61         q[i].so/=k;q[i].mo/=k;
    62     }
    63     sort(q+1, q+M+1, CMP);
    64     for(int i = 1; i <= M; i++){
    65         printf("%lld/%lld
    ", q[i].so, q[i].mo);
    66     }
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    css3回顾 checkbox
    mysql在linux下的安装
    LNMP(linux+nginx+mysql+php)服务器环境配置
    linux下如何查看某软件是否已安装
    Linux查看系统信息的一些命令及查看已安装软件包的命令
    正确配置nginx和php
    服务器搭建:手把手教你配置web服务之nginx1
    搭配环境一(手动搭建,重要!!)
    安装配置nginx
    nginx配置参数中文详解
  • 原文地址:https://www.cnblogs.com/ymzjj/p/9565715.html
Copyright © 2011-2022 走看看