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

题目描述

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

具体来说,小\(Z\)把这\(N\)只袜子从\(1\)到\(N\)编号,然后从编号\(L\)到\(R\)(\(L\)尽管小\(Z\)并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。

你的任务便是告诉小\(Z\),他有多大的概率抽到两只颜色相同的袜子。当然,小\(Z\)希望这个概率尽量高,所以他可能会询问多个\((L,R)\)以方便自己选择。

然而数据中有\(L=R\)的情况,请特判这种情况,输出\(0/1\)。

输入输出格式

输入格式:

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

输出格式:

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

说明

\(30\%\)的数据中 \(N,M \le 5000\);

\(60\%\)的数据中 \(N,M \le 25000\);

\(100\%\)的数据中 \(N,M \le 50000,1 \le L < R \le N,Ci \le N\)。


莫队的基本思想是对询问进行分块,保证询问的集合有一定的顺序,使答案状态改变次数在能接受的范围内。

对于此题

先以\(l\)为关键字排序,然后将询问分成\(\sqrt m\)块,对块内以\(r\)排序

对每个块暴力处理第一个询问,然后右移右区间,暴力移动左区间

每次移动左区间不会超过\(\sqrt n\),右区间移动之和基本只是整个序列,复杂度是对的(有胡扯的嫌疑

对每个答案状态维护

\(\sum C_{color[i]}^2\) \(color[i]\)表示当前区间颜色为\(i\)的位置的个数

显然答案再除上总情况就可以了

吐糟一下,分块类似算法和淀粉质写起来很不爽不知道为什么。。


Code:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define ll long long
const ll N=5e4+10;
struct node{ll l,r,id;}ask[N];
bool cmp1(node a,node b){return a.l<b.l;}
bool cmp2(node a,node b){return a.r<b.r;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll anx[N],any[N],n,m,m_,c[N],clo[N],sum;
ll cal(ll d)
{return d*(d-1)/2;
}
void updata(ll pos,ll d)
{sum-=cal(clo[c[pos]]);clo[c[pos]]+=d;sum+=cal(clo[c[pos]]);
}
void solve(ll l,ll r)
{memset(clo,0,sizeof(clo));sum=0;std::sort(ask+l,ask+r+1,cmp2);for(ll j=ask[l].l;j<=ask[l].r;j++)updata(j,1);ll p=cal(ask[l].r+1-ask[l].l);ll d=gcd(sum,p);anx[ask[l].id]=sum/d,any[ask[l].id]=p/d;for(ll j=l+1;j<=r;j++){for(ll k=ask[j-1].r+1;k<=ask[j].r;k++)updata(k,1);if(ask[j-1].l<ask[j].l){for(ll k=ask[j-1].l;k<ask[j].l;k++)updata(k,-1);}else{for(ll k=ask[j-1].l-1;k>=ask[j].l;k--)updata(k,1);}p=cal(ask[j].r+1-ask[j].l);d=gcd(sum,p);anx[ask[j].id]=sum/d,any[ask[j].id]=p/d;}
}
int main()
{//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);scanf("%lld%lld",&n,&m_);for(ll i=1;i<=n;i++) scanf("%lld",c+i);for(ll l,r,i=1;i<=m_;i++){scanf("%lld%lld",&l,&r);if(l==r) anx[i]=0,any[i]=1;else ask[++m]={l,r,i};}std::sort(ask+1,ask+1+m,cmp1);ll t=sqrt(m)+1,k=1;for(;k*t<=m;k++){ll l=(k-1)*t+1,r=k*t;solve(l,r);}--k;if(k*t!=m)solve(k*t+1,m);for(ll i=1;i<=m_;i++)printf("%lld/%lld\n",anx[i],any[i]);return 0;
}

2018.9.29

转载于:https://www.cnblogs.com/butterflydew/p/9726744.html

P1494 [国家集训队]小Z的袜子/莫队学习笔记(误相关推荐

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

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

  2. P1494 [国家集训队]小Z的袜子

    P1494 [国家集训队]小Z的袜子 题意: 有一个长度为 n 的序列c[i] .现在给出 m个询问,每次给出两个数l,r ,从编号在 l 到 r 之间的数中随机选出两个不同的数,求两个数相等的概率. ...

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

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

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

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

  5. 并不对劲的bzoj2038:p1494:[国家集训队]小Z的袜子

    题目大意 有\(n\)(\(n\leq5*10^4\))个数\(a_1,a_2,...,a_n\)(\(\forall i\in[1,n], 1\leq a_i\leq n\)) \(m\)(\(m\ ...

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

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

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

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

  8. 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)

    题目传送门 1 /* 2 莫队算法:求出[l, r]上取出两只相同袜子的个数. 3 莫队算法是离线处理一类区间不修改查询类问题的算法.如果你知道了[L,R]的答案,可以在O(1)的时间下得到 4 [L ...

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

    莫队也是暴力的一种,不过可以很有效的降低复杂度 如果我们已知[l, r]的答案,能在O(1)时间得到[l+1,r]的答案以及[l, r-1]的答案,即可使用莫队算法. 时间复杂度为O(n^1.5).如 ...

最新文章

  1. Properties持久的属性集
  2. 快讯 | 老黄啊,特斯拉背着你找AMD了,咱可不能给他降价
  3. 【django轻量级框架】云端系统之Django框架实现云端留言板(不用数据库,看不懂你来打我)
  4. 七、排序(3)——线性排序
  5. 这个公式竟然堪称数学界的画家......
  6. SQL Server游标
  7. spring 源码下载地址
  8. Android Studio下载安装及配置图文教程
  9. 服务器压力测试_性能测试相关的面试题
  10. 【机器学习笔记之八】使用朴素贝叶斯进行文本的分类
  11. Atitti v5住宿服务部后勤部建设指引指南.docx
  12. 获取抖音无水印视频地址
  13. ‘__NR_sigreturn’ was not declared in this scope
  14. On Smoothness of a Vector Field-Application to Optical Flow
  15. css3动画 提交成功圆圈画对勾
  16. 数学与计算机学院 林晖,龙岩学院二届二次教代会各代表团代表、特邀代表、列席代表名单及讨论地点安排...
  17. 《荒漠甘泉》4月19日
  18. ROK(万国觉醒)服务器卡顿解决方案
  19. iOS - AliPay 支付宝支付
  20. java 版 mc 手柄_我的世界Java版21w06a

热门文章

  1. 当把CocoaPods生成的workspace移动到上层目录时
  2. 虚拟机危险!一个存在11年的缓冲区溢出漏洞--毒液
  3. jquery.validate+jquery.form提交的三种方式
  4. sql不能使用OpenRowset
  5. 上网行为审计产品对比(2008版)
  6. pb调用java webservice_PB调用各类WebService或c#程序
  7. [Java] 蓝桥杯ADV-185 算法提高 五次方数
  8. python连接数据库oracle_python 连接oracle数据库:cx_Oracle
  9. 外点罚函数matlab程序_关于图像轮廓识别的程序实现
  10. Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理