[bzoj 2038 OR 清橙A1206 小Z的袜子]莫队算法

通过解决小Z找袜子的问题,介绍并实现了一种基于莫队算法的解决方案,用于高效计算区间内特定条件的概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[bzoj 2038 OR 清橙A1206 小Z的袜子]莫队算法

题意描述[清橙A1206 时限:1s] [bzoj 2038 时限:20s]
题意描述
 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……
  具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。
  你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子。当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择。
输入格式
   输入文件第一行包含两个正整数N和M。N为袜子的数量,M为小Z所提的询问的数量。
  接下来一行包含N个正整数Ci,其中Ci表示第i只袜子的颜色,相同的颜色用相同的数字表示。
  再接下来M行,每行两个正整数L,R表示一个询问。
输出格式:输出文件包含M行,对于每个询问在一行中输出分数A/B表示从该询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。若该概率为0则输出0/1,否则输出的A/B必须为最简分数。
数据范围
30% 的数据中 N,M5000
60% 的数据中 N,M25000
100% 的数据中 N,M500001L<RNCiN
解题思路
莫队入门题。
cnt[i] 表示区间中颜色为 i 的个数。
首先是公式推导:
=i=ki=1C2cnt[i]=i=ki=1cnt[i](cnt[i]1)2(k)
然后,莫队搞一搞。
TLE好久,,,结果发现莫队分块的时候,除号写成了取模!!! world sing how turn!!!

#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

//#pragma comment(linker, "/STACK:1024000000,1024000000")

#define FIN             freopen("input.txt","r",stdin)
#define FOUT            freopen("output.txt","w",stdout)
#define fst             first
#define snd             second
#define __mid__         int mid = ((l + r) >> 1)

typedef long long LL;
typedef pair<int, int> PII;

const int MAXN = 100000 + 5;

int N, M, C[MAXN];
int block, pos[MAXN];
LL cnt[MAXN];
LL up[MAXN], dw[MAXN], val;

struct Q {
    int l, r, id;
    bool operator < (const Q& e) const {
        if(pos[l] == pos[e.l]) return pos[r] < pos[e.r];
        return pos[l] < pos[e.l];
    }
} q[MAXN];
inline void update(const int& x, int v) {
    val -= (LL)cnt[C[x]] * (cnt[C[x]] - 1) >> 1;
    cnt[C[x]] += v;
    val += (LL)cnt[C[x]] * (cnt[C[x]] - 1) >> 1;
}
LL gcd(LL a, LL b) {return b == 0 ? a : gcd(b, a % b);}
int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif // ONLINE_JUDGE
    int lp, rp, id;
    scanf("%d %d", &N, &M);
    block = ceil(sqrt(N));
    for(int i = 1; i <= N; i++) {
        scanf("%d", &C[i]);
        pos[i] = (i - 1) / block;
    }
    for(int i = 1; i <= M; i++) {
        scanf("%d %d", &q[i].l, &q[i].r);
        q[i].id = i;
    }
    sort(q + 1, q + M + 1);
    memset(cnt, 0, sizeof(cnt));
    lp = 1, rp = 0, val = 0;
    for(int i = 1; i <= M; i++) {
        id = q[i].id;
        if(q[i].l == q[i].r) {
            up[id] = 0, dw[id] = 1;
            continue;
        }
        while(rp < q[i].r) {
            rp ++;
            update(rp, 1);
        }
        while(rp > q[i].r) {
            update(rp, -1);
            rp --;
        }
        while(lp < q[i].l) {
            update(lp, -1);
            lp ++;
        }
        while(lp > q[i].l) {
            lp --;
            update(lp, 1);
        }
        up[id] = val;
        dw[id] = (LL)(q[i].r - q[i].l + 1) * (q[i].r - q[i].l) >> 1;
        LL temp = gcd(up[id], dw[id]);
        up[id] /= temp, dw[id] /= temp;
    }
    for(int i = 1; i <= M; i++) {
        if(up[i] == 0) dw[i] = 1;
        printf("%lld/%lld\n", up[i], dw[i]);
    }
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值