【bzoj 2038】 [2009国家集训队]小Z的袜子(算法效率--莫队分块算法 模版题)
题意:小Z有N只袜子,有不同的颜色。他有M个提问,问从编号为[L,R]的袜子中随机选一双同色的袜子的概率,用最简分数表示。
解法:经典的莫队算法——无修改、不强制在线(可离线)、状态转移可以一步完成。
步骤如下:
1.对询问按第一关键字的平方根 sqrt(x) 从小到大排序进行分组,再是各组中按第二关键字 y 从小到大排序。O(m log m)。
2.一步步转移,第一关键字最多转移 O(sqrt(n)),第二关键字是 O(n) ,相结合就是 O(n*sqrt(n))。
总时间复杂度就是 O(n*sqrt(n))。
P.S.我第一个代码WA怎么改都对不了,应该是不能直接对颜色的计数数组通过 +1 和 -1 对答案的贡献不同而直接转移状态。而要减去原来该数对答案的贡献,再加上新的贡献。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 #include<cmath>
7 using namespace std;
8 typedef long long LL;
9
10 const int N=50010,M=50010,D=50010;
11 int n,m,sqn;
12 int c[N],h[N];
13 LL ans[M][2];
14 struct query{int l,r,id;}q[M];
15
16 bool cmp(query x,query y)
17 {
18 int xx=x.l/sqn,yy=y.l/sqn;
19 if (xx!=yy) return xx<yy;
20 return x.r<y.r;
21 }
22 int read()
23 {
24 char ch=getchar();
25 int x=0;
26 while (ch<'0'||ch>'9') ch=getchar();
27 while (ch>='0'&&ch<='9') x=x*10+ch-'0', ch=getchar();
28 return x;
29 }
30 LL gcd(int x,int y) {return y?gcd(y,x%y):x;}
31 int main()
32 {
33 n=read(),m=read();
34 for (int i=1;i<=n;i++) c[i]=read();
35 for (int i=1;i<=m;i++)
36 {
37 q[i].l=read(),q[i].r=read();
38 q[i].id=i;
39 }
40 sqn=sqrt(n);
41 sort(q+1,q+1+m,cmp);
42
43 int l=1,r=1;
44 LL sum=0;
45 memset(h,0,sizeof(h));
46 h[c[1]]++;
47 for (int i=1;i<=m;i++)
48 {
49 while (l<q[i].l) sum=sum-2*h[c[l]]+2,h[c[l]]--,l++;
50 while (r>q[i].r) sum=sum-2*h[c[r]]+2,h[c[r]]--,r--;
51 while (l>q[i].l) l--,sum+=2*h[c[l]],h[c[l]]++;
52 while (r<q[i].r) r++,sum+=2*h[c[r]],h[c[r]]++;
53 LL w=(q[i].r-q[i].l)*(q[i].r-q[i].l+1);
54 LL gd=gcd(sum,w);
55 ans[q[i].id][0]=sum/gd,ans[q[i].id][1]=w/gd;
56 }
57 for (int i=1;i<=m;i++)
58 printf("%I64d/%I64d\n",ans[i][0],ans[i][1]);
59 return 0;
60 }
WA
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cmath>
4 #include<cstring>
5 #include<iostream>
6 using namespace std;
7 const int Max=50010;
8 int n,m,t=0;
9 int s[Max],c[Max],ans1[Max],ans2[Max];
10 struct hp{int l,r,t,k;}
11 a[Max];
12 int gcd(int x,int y)
13 {
14 if (x<y) swap(x,y);
15 if (x%y==0) return y;
16 return gcd(y,x%y);
17 }
18 int cmp(const void *x,const void *y)
19 {
20 hp xx=*(hp *)x;
21 hp yy=*(hp *)y;
22 if (xx.t==yy.t) return xx.r-yy.r;
23 return xx.t-yy.t;
24 }
25 int make(int x)
26 { //if (x<2) return 0;
27 if (x%2==0) return (x/2)*(x-1);
28 return x*((x-1)/2);
29 }
30 void block(int id,int l,int r,int ll,int rr)
31 {
32 /*if (ll<l)
33 for (int i=ll;i<l;i++)
34 {//因为ll为0,所以每次都会make(-1),出现负数便错误!//若特殊算第一次,或算1~n为初始值,才行
35 //幸亏我想着算组合make时,若x<2宣布了2个怎么办,没有进一步看x=0或1时不会算错,就加了判断语句,便发现对了一些
36 t-=make(s[c[i]]);
37 s[c[i]]--;
38 t+=make(s[c[i]]);
39 }*/
40 if (ll<l)
41 for (int i=ll;i<l;i++)
42 {
43 t-=make(s[c[i]]);
44 s[c[i]]--;
45 t+=make(s[c[i]]);
46 }
47 if (ll>l)
48 for (int i=l;i<ll;i++)
49 {
50 t-=make(s[c[i]]);
51 s[c[i]]++;
52 t+=make(s[c[i]]);
53 }
54 if (rr<r)
55 for (int i=rr+1;i<=r;i++)
56 {
57 t-=make(s[c[i]]);
58 s[c[i]]++;
59 t+=make(s[c[i]]);
60 }
61 if (rr>r)
62 for (int i=r+1;i<=rr;i++)
63 {
64 t-=make(s[c[i]]);
65 s[c[i]]--;
66 t+=make(s[c[i]]);
67 }
68 int tt,x;
69 if (!t) {ans1[a[id].k]=0; ans2[a[id].k]=1; return;}
70 tt=make(r-l+1);//t/tt
71 x=gcd(tt,t);
72 ans1[a[id].k]=t/x;
73 ans2[a[id].k]=tt/x;
74 }
75 int main()
76 {
77 //freopen("a.in","r",stdin);
78 //freopen("b.out","w",stdout);
79 scanf("%d%d",&n,&m);
80
81 for (int i=1;i<=n;i++)
82 scanf("%d",&c[i]);
83 double x=sqrt(n);
84 for (int i=1;i<=m;i++)
85 {
86 scanf("%d%d",&a[i].l,&a[i].r);
87 a[i].t=(int)(a[i].l/x);
88 a[i].k=i;
89 }
90 qsort(a+1,m,sizeof(hp),cmp);
91
92 memset(s,0,sizeof(s));
93 //a[0].l=0; a[0].r=0;
94 a[0].l=1;a[0].r=n;
95 for (int i=1;i<=n;i++) s[c[i]]++;
96 for (int i=1;i<=n;i++)
97 t+=make(s[i]);
98 for (int i=1;i<=m;i++)
99 block(i,a[i].l,a[i].r,a[i-1].l,a[i-1].r);
100 for (int i=1;i<=m;i++)
101 printf("%d/%d\n",ans1[i],ans2[i]);
102 //system("pause");
103 return 0;
104 }
AC
【bzoj 2038】 [2009国家集训队]小Z的袜子(算法效率--莫队分块算法 模版题)的更多相关文章
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法】
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
- BZOJ 2038 2009国家集训队 小Z的袜子【模板·莫队】
[题解] 1,先说说莫队算法. 莫队算法是用来离线处理区间问题的算法.非常易于理解和使用,且运用十分广泛. 假设我们现在已知区间[L,R]的答案,如果我们能以较低的时间复杂度扩展得到区间$[L-1,R ...
- 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子
二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...
- BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队
BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
随机推荐
- .netcore 急速接入第三方登录,不看后悔
新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: https://oauthlogin.net/ 前言 此次带来得这个小 ...
- 【Git】Git初始化一个仓库
文章目录 初始化仓库 检查当前文件状态 跟踪新文件 提交更新 跳过使用暂存区域 移除文件 添加远程仓库 推送到远程仓库 简单记录-慕课网 从0开始 独立完成企业级Java电商网站开发 Git初始化一个 ...
- 【Oracle】增量备份和全库备份怎么恢复数据库
1差异增量实验示例 1.1差异增量备份 为了演示增量备份的效果,我们在执行一次0级别的备份后,对数据库进行一些改变. 再执行一次1级别的差异增量备份: 执行完1级别的备份后再次对数据库进行更改: 再执 ...
- SSTI
最牛bypass:https://blog.csdn.net/solitudi/article/details/107752717 SSTI的奇怪绕过姿势:https://blog.csdn.net/ ...
- 修改主机名后VCS的修改
转:https://blog.csdn.net/nauwzj/article/details/6733135 一. 单机改主机名需更改以下文件: /etc/hosts /etc/hostname.hm ...
- Spring Boot(IDEA,Gradle)超详细用户管理项目(一)——Hello World
1.构建工具的配置(Gradle):自定义-所有设置:构建.执行.部署-构建工具-Gradle: 设置Gradle用户主目录:(该目录相当于仓库,gradle将下载所需依赖到此目录下),此目录下可新建 ...
- Python语言程序设计---函数的定义与使用
推荐一个Python学习交流的q群:610380249 在学习Python的过程中,有什么不懂的问题都可以发群里,一起讨论. 1 函数的理解和定义 函数是一段代码的表示,所指定的参数是一种占位符,如果 ...
- feign使用okHttpClient,调用原理
最近项目中 spring cloud 用到http请求,使用feign,配置okhttp,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结 yml.pom配置 ...
- pycharm安装完成后的一些基本设置
1.设置背景色 file-->Setting-->Appearance&Behavior-->Appearance 2.设置主题 settings --> editor ...
- ldf和mdf文件怎么还原到sqlserver数据库
1.把mdf文件和ldf文件拷贝到数据库的默认路径C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA里:2.在sq ...