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

Input
输入文件第一行包含两个正整数N和M。N为袜子的数量,M为小Z所提的询问的数量。接下来一行包含N个正整数Ci,其中Ci表示第i只袜子的颜色,相同的颜色用相同的数字表示。再接下来M行,每行两个正整数L,R表示一个询问。

Output
包含M行,对于每个询问在一行中输出分数A/B表示从该询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。若该概率为0则输出0/1,否则输出的A/B必须为最简分数。(详见样例)

Sample Input
6 4

1 2 3 3 3 2

2 6

1 3

3 5

1 6

Sample Output
2/5

0/1

1/1

4/15

【样例解释】

询问1:共C(5,2)=10种可能,其中抽出两个2有1种可能,抽出两个3有3种可能,概率为(1+3)/10=4/10=2/5。

询问2:共C(3,2)=3种可能,无法抽到颜色相同的袜子,概率为0/3=0/1。

询问3:共C(3,2)=3种可能,均为抽出两个3,概率为3/3=1/1。

注:上述C(a, b)表示组合数,组合数C(a, b)等价于在a个不同的物品中选取b个的选取方案数。

【数据规模和约定】

30%的数据中 N,M ≤ 5000;

60%的数据中 N,M ≤ 25000;

100%的数据中 N,M ≤ 50000,1 ≤ L < R ≤ N,Ci ≤ N。

HINT
Source
版权所有者:莫涛

思路:
用数组flag[i] 记录当前区间中已经有了多少个i数字。然后常规的莫队转移即可。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 50010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
pll ans[maxn];
ll Ans=0ll;
int l=1;
int r=0;
struct node
{int l,r,id;
}a[maxn];
int pos[maxn];
int n,m;
int len;
bool cmp(node aa,node bb)
{if(pos[aa.l]==pos[bb.l]){return aa.r<bb.r;}else{return pos[aa.l]<pos[bb.l];}
}
int col[maxn];
int flag[maxn];
void add(int x)
{Ans+=1ll*flag[col[x]];flag[col[x]]++;
}
void del(int x)
{flag[col[x]]--;Ans-=1ll*flag[col[x]];
}
int main()
{//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);gg(n);gg(m);len=(int)(sqrt(n));repd(i,1,n){gg(col[i]);}repd(i,1,m){gg(a[i].l);gg(a[i].r);a[i].id=i;pos[i]=i/len;}sort(a+1,a+1+m,cmp);repd(i,1,m){while(l>a[i].l){l--;add(l);}while(r<a[i].r){r++;add(r);}while(l<a[i].l){del(l);l++;}while(r>a[i].r){del(r);r--;}ans[a[i].id].fi=Ans;ll temp=a[i].r-a[i].l+1;ans[a[i].id].se=(temp*(temp-1ll))>>1;}repd(i,1,m){if(!ans[i].fi){puts("0/1");continue;}ll g=gcd(ans[i].fi,ans[i].se);printf("%lld/%lld\n",ans[i].fi/g,ans[i].se/g);}return 0;
}inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11365056.html

BZOJ2038 : [2009国家集训队]小Z的袜子(hose)(莫队算法)相关推荐

  1. [BZOJ2038] [2009国家集训队] 小Z的袜子(hose) (莫队)

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

  2. 【bzoj2038】[2009国家集训队]小Z的袜子(hose) 莫队算法

    原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...

  3. bzoj2038: [2009国家集训队]小Z的袜子(hose) 莫队

    Time Limit: 20 Sec Memory Limit: 259 MB Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小 ...

  4. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门

    题目链接:2038: [2009国家集训队]小Z的袜子(hose) 题目: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再 ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(莫队算法例题)

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

  6. bzoj2038[2009国家集训队]小Z的袜子(hose)

    bzoj2038[2009国家集训队]小Z的袜子(hose) 题意: 把N只袜子从1到N编号,每次求从编号为L到R的袜子中抽两只,有多大的概率抽到颜色相同的袜子. 题解: 不知道要用什么数据结构,但是 ...

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

    [传送门:BZOJ2038] 简要题意: 给出n只袜子,每只袜子都有颜色 有多个询问,每次询问一个区间L,R,求出在这个区间内选出两只相同颜色袜子的概率,以最简分数形式输出(不用化成整数,如果概率为0 ...

  8. bzoj2038: [2009国家集训队]小Z的袜子(hose)(莫队)

    题目传送门 强啊学了一发莫队. 解法: 刚看到这题没啥思路就只有一个n方的垃圾.. %题解说是莫队,学了一发. 莫队大概就是用来优化暴力的一个东西. 这道题的数学解法相必大家都会.. 在n个袜子里面选 ...

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

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

最新文章

  1. 数字双胞胎技术和物联网如何帮助企业取得成功
  2. linux防火墙 限制端口,Linux开启防火墙并限制开放端口
  3. rea t插件 vscode_精选!15个必备的VSCode插件-Go语言中文社区
  4. c语言sort函数排序二维数组,js 二维数组排序sort()函数
  5. synchronized简介
  6. (50)IO的延迟约束(输入延迟约束)
  7. Open Flash Chart 图表组件
  8. Hub与Switch的帧的广播细节
  9. sir模型matlab案例_直播案例 | 人群接触网络中的 SIR 疫情模拟
  10. boost库asio错误码
  11. 32bit GM命令
  12. 电影资源 BT PT下载的电影命名 规则 资源 详解
  13. 金属类的大宗商品创下新高,对冲基金疯狂买涨
  14. 宣纸一笔,思重于行——聊一聊思考的价值
  15. 物体成瘾性_如何克服数字成瘾和更多的意志力
  16. java gef_GEF简介
  17. Exif Editor For Mac(图像EXIF编辑器软件)
  18. Unity UI框架的搭建
  19. python获取当前时间、今天零点、23时59分59秒、昨天的当前时间、明天的当前时间
  20. 智慧社区网格化管理php,智慧社区网格化平台

热门文章

  1. Java Spring实现原理研究之Servlet initialization初始化过程
  2. get metadata in QHD - still has cache logic
  3. Java和ABAP中的几种引用类型的分析和比较
  4. python学习-图片处理小程序(PIL的安装、PIL.Image的使用、 示例程序(图片灰度值修改))
  5. vs2013怎么清理解决方案_厕所漏水怎么办?厕所免拆砖防水维修方案
  6. python所有算法_Python实现的各种常见分布算法示例
  7. 美团架构师写的Java面试宝典_2019最新美团java面试题及答案
  8. uml 继承_UML 完全解析和总结
  9. no amd graphics driver怎么解决_《英雄联盟手游》卡顿怎么解决 游戏设置优化教程...
  10. python有效变量名_Python变量命名规则