【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 ...
随机推荐
- 利用github给国外文件下载加速
前言 作为一名程序员,经常需要下载一些编程相关的环境,而国内的网络环境大家都知道,有的文件用浏览器是下载不动的,于是我有了利用github下载文件的想法. 我的demo项目地址:https://git ...
- 【JavaWeb】JSTL 标签库
JSTL 标签库 简介 JSTL(JSP Standard Tag Library),即 JSP 标准标签库.标签库是为了替换代码脚本,使得整个 jsp 页面变得更加简洁. JSTL 有五个功能不同的 ...
- LeetCode106 从中序和后序序列构造二叉树
题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [ ...
- L(kali)A(apache)M(mysql)P(php)环境+wordpress站点搭建
一:LAMP环境配置 首先LAMP(linux+apache+mysql+php)即为本次搭建网站所需的环境,由于本次使用的debian衍生版kali版本自带lamp,因此只要在服务器上启动相应服务既 ...
- /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --start-pos=307
/usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --st ...
- 【Oracle】DRM官方介绍
DRM 简介 By: Allen Gao 首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer ...
- 惠普电脑(HP PHILIPS系列)安装ubuntu后无法连接WIFI解决方案(手动安装8821CE驱动)
一步一步来, 先说环境: 我的电脑是HP PHILIPS系列,ubuntu版本是16.04 背景: win10安装ubuntu后发现无法连接wifi(但win10系统可以连接WIFI),在ubuntu ...
- 1V升5V芯片,1V升5V电路图规格书
如果需要1V输入的话,可以看到PW5100的最低低压输入0.7V,就可以达到要求了. 同时PW5100也具有较大的输入开关电流1.5A,可以满足输出的要求和功能. 对于1V的供电来说,由于电压太低,我 ...
- secrets 管理工具 Vault 的介绍、安装及使用
原文:https://ryan4yin.space/posts/expirence-of-vault/ Vault 是 hashicorp 推出的 secrets 管理.加密即服务与权限管理工具.它的 ...
- windows桌面快速添加控制面板网络等图标
默认安装后的windows系统只有回收站. rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0