要使用莫队算法前提 ,已知[l,r]的答案,要能在logn或者O(1)的时间得到[l+1,r],[l-1,r],[l,r-1],[l,r+1],适用于一类不修改的查询

优美的替代品——分块
将n个数分成sqrt(n)块
按区间排序,以左端点所在块内为第一关键字,右端点为第二关键字,进行排序
也就是以( pos [l],r )排序
然后搞就可以了

搞得过程是这样的:
一、i与i+1在同一块内,r单调递增,所以r是O(n)的。由于有n^0.5块,所以这一部分时间复杂度是n^1.5。
二、i与i+1跨越一块,r最多变化n,由于有n^0.5块,所以这一部分时间复杂度是n^1.5
三、i与i+1在同一块内时变化不超过n^0.5,跨越一块也不会超过2*n^0.5,不妨看作是n^0.5。由于有n个数,所以时间复杂度是n^1.5
于是就变成了O(n^1.5)了

——————————以上来自http://hzwer.com/2782.html,略有修改

黄学长的前两条说的是更新区间右端点r的复杂度是O(n^1.5),这个说的很清楚;

最后一条说的的是更新区间左端点l的复杂度,我想略做添加

排序后的i和i+1个查询如果在同一块变化不超过sqrt(n),但是当跨越一块时,最大却不止是2*n^0.5,可以是n,

这样我们可以在每一个没有查询的块里添加一个辅助查询区间(l=该块的右界,r为下一个真正询问的右界 ),这样最多添加n^0.5这样的查询点 这样总的 查询个数是 n+n^0.5;

这样再应用黄学长第三条,i,i+1在一块,l不超过n^0.5,跨越一块(此时由于添加辅助查询点)最多是2*n^0.5

一共有n+n^0.5个查询 所以复杂度是 (n+n^0.5)*n^0.5=(n^0.5+1)n 所以复杂度是n^1.5

(添加辅助点不会变慢)

所以最后复杂度是O(n^1.5)

代码如下:(代码写的不好,如果要看还是看上述链接的比较好,以下仅供娱乐)

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<string>
  5. #include<iostream>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<map>
  9. #include<set>
  10. #include<cmath>
  11. using namespace std;
  12. typedef long long LL;
  13. const int maxn=;
  14. LL gcd(LL a, LL b)
  15. {
  16. if(a==)return b;
  17. while(a%b)
  18. {
  19. LL t=a%b;
  20. a=b;
  21. b=t;
  22. }
  23. return b;
  24. }
  25. int num[maxn],pos[maxn],o[maxn];
  26. LL ans=;
  27. struct node
  28. {
  29. int l,r,id;
  30. LL a,b;
  31. } res[maxn];
  32. bool cmp1(node x,node y)
  33. {
  34. if(pos[x.l]==pos[y.l])return x.r<y.r;
  35. return x.l<y.l;
  36. }
  37. bool cmp2(node x,node y)
  38. {
  39. return x.id<y.id;
  40. }
  41. void change(int pos,int op)
  42. {
  43. LL t=num[o[pos]];
  44. ans-=t*(t-)/;
  45. num[o[pos]]+=op;
  46. t=num[o[pos]];
  47. ans+=t*(t-)/;
  48. }
  49. int main()
  50. {
  51. int n,m;
  52. ans=;
  53. scanf("%d%d",&n,&m);
  54. int block=(int)(sqrt(n));
  55. for(int i=; i<=n; ++i)
  56. scanf("%d",&o[i]),pos[i]=(i-)/block+;
  57. for(int i=; i<=m; ++i)
  58. scanf("%d%d",&res[i].l,&res[i].r),res[i].id=i;
  59. sort(res+,res+m+,cmp1);
  60. for(int i=,l,r; i<=m; ++i)
  61. {
  62. if(i==)
  63. for(int j=res[i].l; j<=res[i].r; ++j)
  64. change(j,);
  65. else
  66. {
  67. for(; r+<=res[i].r; ++r)
  68. change(r+,);
  69. for(; r>res[i].r; --r)
  70. change(r,-);
  71. for(; l<res[i].l; ++l)
  72. change(l,-);
  73. for(; l->=res[i].l; --l)
  74. change(l-,);
  75. }
  76. l=res[i].l,r=res[i].r;
  77. if(res[i].l==res[i].r)
  78. {
  79. res[i].a=;
  80. res[i].b=;
  81. continue;
  82. }
  83. res[i].a=ans;
  84. LL t=res[i].r-res[i].l+;
  85. res[i].b=t*(t-)/;
  86. t=gcd(res[i].a,res[i].b);
  87. res[i].a/=t;
  88. res[i].b/=t;
  89. }
  90. sort(res+,res++m,cmp2);
  91. for(int i=; i<=m; ++i)
  92. printf("%lld/%lld\n",res[i].a,res[i].b);
  93. return ;
  94. }

BZOJ2038: [2009国家集训队]小Z的袜子(hose) 莫队算法的更多相关文章

  1. BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 3577  Solved: 1652[Subm ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10299  Solved: 4685[Sub ...

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

    Brief Description 给定一个序列,您需要处理m个询问,每个询问形如[l,r],您需要回答在区间[l,r]中任意选取两个数相同的概率. Algorithm Design 莫队算法入门题目 ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

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

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

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

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

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

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

  8. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

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

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

随机推荐

  1. Understanding Responsive Web Design: Cross-browser Compatibility

    http://www.sitepoint.com/understanding-responsive-web-design-cross-browser-compatibility/ In the las ...

  2. WDC2106 iOS10新特性及开发者要注意什么

    昨晚苹果在旧金山召开了WWDC,看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强 ...

  3. 实时数据处理环境搭建flume+kafka+storm:0.环境依赖

    storm需要java和Python  部署依赖环境 --- 要求Java 6+ .Python 2.6.6+   java,python安装配置完成       

  4. win7 提升windows服务权限使非管理员用户可以控制windows服务的开启和关闭

    #include <windows.h>#include <tchar.h>#include <strsafe.h>#include <aclapi.h> ...

  5. 1053: [HAOI2007]反素数ant - BZOJ

    Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数 ...

  6. struts2+hibernate-jpa+Spring+maven 整合(2)

    1.修改pom.xml 1. 添加  slf4j-api <dependency> <groupId>org.slf4j</groupId> <artifac ...

  7. 如何安装Favicon

    如何安装Favicon favicon.ico图像放在根目录下(也可以是其他目录)在页面源文件的<head></head>标签之间插入 <link rel="s ...

  8. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...

  9. PAT-乙级-1040. 有几个PAT(25)

    1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...

  10. sqlmap动态sql优化,避免传参失误批量修改和删除操作!

    分析以下的sqlmap存在问题: <delete id="deletePartspic" parameterClass="TblSpPartspic"&g ...