[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%30\%的数据中 N,M≤5000N,M ≤ 5000;
60%60\%的数据中 N,M≤25000N,M ≤ 25000;
100%100\%的数据中 N,M≤50000,1≤L<R≤N,Ci≤NN,M ≤ 50000,1 ≤ L 。
解题思路
莫队入门题。
用cnt[i]cnt[i]表示区间中颜色为ii的个数。
首先是公式推导:
区间的答案=∑i=ki=1C2cnt[i]=∑i=ki=1cnt[i]∗(cnt[i]−1)2(k表示颜色总数)区间的答案=\sum_{i=1}^{i=k}C_{cnt[i]}^2=\sum_{i=1}^{i=k}\frac{cnt[i]*(cnt[i]-1)}{2} (\color{blue}{k表示颜色总数})
然后,莫队搞一搞。
TLE好久,,,结果发现莫队分块的时候,除号写成了取模!!!

#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_JUDGEFIN;
#endif // ONLINE_JUDGEint 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;
}

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

  1. 清橙A1206 小Z的袜子(莫队算法)

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:744   AC次数:210   平均分:44.44 将本题分享到:        查看未格式化的试题    ...

  2. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  3. 洛谷P1494 [国家集训队]小Z的袜子 莫队

    题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编 ...

  4. 【bzoj2038】[国家集训队2010]小Z的袜子 莫队

    莫队:就是一坨软软的有弹性的东西Duang~Duang~Duang~ 为了防止以左端点为第一关键字以右端点为第二关键字使右端点弹来弹去,所以让左端点所在块为关键字得到O(n1.5)的时间效率,至于分块 ...

  5. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  6. P1494 小Z的袜子

    P1494 小Z的袜子 莫队板子题,对询问进行排序+分块,从而得到巧妙的复杂度 对于L,R的询问. 设其中颜色为x,y,z的袜子的个数为a,b,c... 那么答案即为 (a*(a-1)/2+b*(b- ...

  7. 【清橙 A1206】小Z的袜子(莫队算法)

    [清橙 A1206]小Z的袜子(莫队算法) A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:1144   AC次数:319   平均分:43.15 将本题分 ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

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

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

最新文章

  1. 人脸识别市场广 离不开政策支持及市场强劲需求
  2. python的list去除重复
  3. 噪声与平滑滤波(MATLAB)
  4. JVM运行时数据区分析
  5. 英语作文计算机主板,(完整版)电脑主板bios英文版的中英文对照翻译.pdf
  6. FCKeditor上传漏洞总结
  7. 初识exe程序反汇编小感
  8. ValueError: Duplicate plugins for name projector解决
  9. Excel怎么对比两个表格数据
  10. COMSOL(1)寻找最小曲面
  11. 取消全部呼叫转移代码_不想接电话,又不好意思挂断?输入一串代码,让你手机秒变空号!...
  12. GTX高速收发器Transceiver之发射端Transmitter(UG476)
  13. 三国管理智慧之刘备的管理之道
  14. 最简单、最傻瓜化的虚拟主机管理软件-LuManager主机管理系统
  15. 亚马逊测评项目怎么做?市场如何?测评资源怎么找​?
  16. 虚拟机中的linux怎么进入命令方式
  17. 未转变者服务器3.26物品id,Unturned未转变者3.21版本物品ID代码汇总
  18. 接口隔离原则-快速理解
  19. Windows操作系统及其应用
  20. python pptx库中文文档_基于python-pptx库中文文档及使用详解

热门文章

  1. H3C BGP与IGP交互配置
  2. RabbitMQ从入门到实战(图文并茂)
  3. (Window环境) curl: (6) Could not resolve host: application curl: (6) Could not resolve host: ‘localhos
  4. 图片预览(原生js实现)
  5. 中国电信物联网建设全面提速 投入三亿元补贴物联网模块
  6. mybatis 标准输出日志报错: The setting logImpl is not known. Make sure you spelled it correctly (case sensit
  7. vuejs实现购物车满多少减多少
  8. First-hitting-time model
  9. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately..
  10. 微信小程序实战 wx.showNavigationBarLoading(),下拉动画配置无效