莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的。

今天水了三道莫队题,对普通莫队有了些了解

1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,(或许可以再加些限制)

2.莫队指针移动时的操作一定是O(1)最多O(log(n)),

3.当减值时先减当前的再加,加则反。

T1

水题,维护当前区间sum[i]*sum[i]的和,在进行操作即可

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<string>
  5. 5 #include<algorithm>
  6. 6 #include<cmath>
  7. 7 #include<stack>
  8. 8 #include<map>
  9. 9 #include<queue>
  10. 10 #define ps push_back
  11. 11 #define MAXN 55101
  12. 12 #define ll long long
  13. 13 using namespace std;
  14. 14 ll kuan;
  15. 15 struct node{ll l,r,id,zi,mu;}e[MAXN];
  16. 16 ll se[MAXN],sum[MAXN];
  17. 17 bool cmp(node a,node b)
  18. 18 {
  19. 19 return ((a.l/kuan)!=(b.l/kuan))?(a.l<b.l):(a.r<b.r);
  20. 20 }
  21. 21 bool CMP(node a,node b)
  22. 22 {
  23. 23 return a.id<b.id;
  24. 24 }
  25. 25 ll n,m;ll ans=0;
  26. 26 void jian(ll x)
  27. 27 {
  28. 28 ans-=sum[se[x]]*sum[se[x]];sum[se[x]]--;ans+=sum[se[x]]*sum[se[x]];
  29. 29 }
  30. 30 void add(ll x)
  31. 31 {
  32. 32 ans-=sum[se[x]]*sum[se[x]];sum[se[x]]++;ans+=sum[se[x]]*sum[se[x]];
  33. 33 }
  34. 34 ll gcd(ll a,ll b)
  35. 35 {
  36. 36 return (b==0)?a:gcd(b,a%b);
  37. 37 }
  38. 38 int main()
  39. 39 {
  40. 40 scanf("%lld%lld",&n,&m);kuan=sqrt(n);
  41. 41 for(ll i=1;i<=n;++i)
  42. 42 {
  43. 43 ll x;
  44. 44 scanf("%lld",&se[i]);
  45. 45 }
  46. 46 for(ll i=1;i<=m;++i)
  47. 47 {
  48. 48 ll l,r;
  49. 49 scanf("%lld%lld",&e[i].l,&e[i].r);
  50. 50 e[i].id=i;
  51. 51 }
  52. 52 sort(e+1,e+m+1,cmp);
  53. 53 ll l=1,r=0;
  54. 54 for(ll i=1;i<=m;++i)
  55. 55 {
  56. 56 //printf("l=%lld e[i].l=%lld r=%lld e[i].r=%lld\n",l,e[i].l,r,e[i].r);
  57. 57 while(l<e[i].l){jian(l++);}
  58. 58 while(l>e[i].l){add(--l);}
  59. 59 while(r<e[i].r){add(++r);}
  60. 60 while(r>e[i].r){jian(r--);}
  61. 61 e[i].zi=ans-(e[i].r-e[i].l+1);
  62. 62 e[i].mu=(e[i].r-e[i].l+1)*(e[i].r-e[i].l);
  63. 63 if(e[i].zi==0){e[i].mu=1;continue;}
  64. 64 ll gcdd=gcd(e[i].zi,e[i].mu);
  65. 65 e[i].zi/=gcdd;e[i].mu/=gcdd;
  66. 66 //printf("%lld %lld\n",e[i].zi,e[i].mu);
  67. 67 }
  68. 68 sort(e+1,e+m+1,CMP);
  69. 69 for(ll i=1;i<=m;++i)
  70. 70 {
  71. 71 printf("%lld/%lld\n",e[i].zi,e[i].mu);
  72. 72 }
  73. 73
  74. 74 }

T2

树状数组一个维护当前区间中<=某个数的个数

一个维护<=某个数出现的不同权值的个数

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<string>
  5. 5 #include<algorithm>
  6. 6 #include<cmath>
  7. 7 #include<stack>
  8. 8 #include<map>
  9. 9 #include<queue>
  10. 10 #define ps push_back
  11. 11 #define MAXN 205101
  12. 12 #define ll long long
  13. 13 using namespace std;
  14. 14 struct node{int l,r,id,A,B,ans1,ans2;}e[10*MAXN];
  15. 15 int kuan;int se[MAXN],c[MAXN];
  16. 16 bool cmp(node a,node b){return (a.l/kuan!=b.l/kuan)?(a.l<b.l):(a.r<b.r);}
  17. 17 bool CMP(node a,node b){return a.id<b.id;}
  18. 18 int lowbit(int x){return x&(-x);}int n,m;
  19. 19 void shu_add(int x,int k)
  20. 20 {
  21. 21 for(int i=x;i<=n;i+=lowbit(i))
  22. 22 {
  23. 23 c[i]+=k;
  24. 24 }
  25. 25 }
  26. 26 int get_sum(int x)
  27. 27 {
  28. 28 int ans=0;
  29. 29 for(int i=x;i>=1;i-=lowbit(i))
  30. 30 {
  31. 31 ans+=c[i];
  32. 32 }
  33. 33 return ans;
  34. 34 }
  35. 35 int d[MAXN];int sum[MAXN];
  36. 36 void shu_cishu(int x,int k)
  37. 37 {
  38. 38 for(int i=x;i<=n;i+=lowbit(i))
  39. 39 {
  40. 40 d[i]+=k;
  41. 41 }
  42. 42 }
  43. 43 int get_sum_cishu(int x)
  44. 44 {
  45. 45 int ans=0;
  46. 46 for(int i=x;i>=1;i-=lowbit(i))
  47. 47 {
  48. 48 ans+=d[i];
  49. 49 }
  50. 50 return ans;
  51. 51 }
  52. 52 void add(int x)
  53. 53 {
  54. 54 if(sum[se[x]]==0)
  55. 55 {
  56. 56 shu_cishu(se[x],1);
  57. 57 }
  58. 58 sum[se[x]]++;
  59. 59 shu_add(se[x],1);
  60. 60 }
  61. 61 void jian(int x)
  62. 62 {
  63. 63 sum[se[x]]--;
  64. 64 if(sum[se[x]]==0)
  65. 65 {
  66. 66 shu_cishu(se[x],-1);
  67. 67 }
  68. 68 shu_add(se[x],-1);
  69. 69 }
  70. 70 int main()
  71. 71 {
  72. 72 scanf("%d%d",&n,&m);
  73. 73 kuan=sqrt(n);
  74. 74 for(int i=1;i<=n;++i)
  75. 75 {
  76. 76 scanf("%d",&se[i]);
  77. 77 }
  78. 78 for(int i=1;i<=m;++i)
  79. 79 {
  80. 80 scanf("%d%d%d%d",&e[i].l,&e[i].r,&e[i].A,&e[i].B);
  81. 81 if(e[i].r>n)e[i].r=n;
  82. 82 if(e[i].A>n)e[i].A=n;
  83. 83 if(e[i].B>n)e[i].B=n;
  84. 84 e[i].id=i;
  85. 85 }
  86. 86 sort(e+1,e+m+1,cmp);
  87. 87 int l=1,r=0;
  88. 88 for(int i=1;i<=m;++i)
  89. 89 {
  90. 90 while(l<e[i].l){jian(l++);}
  91. 91 while(l>e[i].l){add(--l);}
  92. 92 while(r<e[i].r){add(++r);}
  93. 93 while(r>e[i].r){jian(r--);}
  94. 94 int A=e[i].A,B=e[i].B;
  95. 95 e[i].ans1=get_sum(B)-((A-1!=0)?get_sum(A-1):0);
  96. 96 e[i].ans2=get_sum_cishu(B)-((A-1!=0)?get_sum_cishu(A-1):0);
  97. 97 }
  98. 98 sort(e+1,e+m+1,CMP);
  99. 99 for(int i=1;i<=m;++i)
  100. 100 {
  101. 101 printf("%d %d\n",e[i].ans1,e[i].ans2);
  102. 102 }
  103. 103 }

小Z的袜子(hose) &&作业 (莫队)的更多相关文章

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

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

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

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

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

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...

  4. BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】

    BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...

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

    小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...

  6. bzoj 2038 小Z的袜子(hose)(莫队算法)

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

  7. 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队

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

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

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

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...

  10. BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...

随机推荐

  1. selenium之利用cookie绕过验证登录

    方法一 第一步 2.第二步 方法二.重点:1.打开验证码页(登录页面):2.首次登录等待三十秒手工输入账密:3.保存cookie至excel后利用cookie脚本登录 1.导入第三方模块xlwt 2. ...

  2. CCNA 第五章 变长子网掩码、汇总和TCP/IP故障排除

    1:VLSM:即变长子网掩码,使用长度不同的子网掩码将大型网络划分为众多子网,以满足不同类型的网络设计. 2:运行老式的路由器和例如:RIP V1协议的网络不能使用VLSM,因为它使用分类路由器选择. ...

  3. 测开之Python自动化全栈工程师+性能专项(送思维导图)

    测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...

  4. SpringBoot+MyBatis练手项目笔记汇总

    以下是我在练习SpringBoot+MyBatis训练时候个人一些笔记汇总(可以点击跳转),献丑了,网上很多大佬的文章都比我写的详细,一些好的文章,我会将贴到各个内容中. 1. 插入数据返回id和内部 ...

  5. Codeforces Round #688 (Div. 2)

    A. Cancel the Trains 题意:给定两个数组,找出这两个数组中有多少重复元素,然后输出 思路:直接找 代码: 1 #include<iostream> 2 #include ...

  6. OO_Unit2_多线程电梯

    CSDN博客链接 一.第一次作业 1.需求分析 单部多线程傻瓜调度(FAFS)电梯 2.实现方案 输入接口解析 类似于Scanner,我们使用ElevatorInput进行阻塞式读取(第一次作业较简单 ...

  7. 29.Map,可变参数

    1.Map集合 1.1Map集合概述和特点[理解] 单列集合一次存一个元素 双列集合一次存两个元素 键:不能重复的        值:可以重复的 Map集合概述 interface Map<K, ...

  8. Git安装教程最新版本(国内gitee国外github)

    Git安装教程最新版本(国内gitee国外github) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 获取大师使用的typora主题: http://w ...

  9. git远端账号问题

    1. gitlab密码修改后git因保存密码无法下载,403 在.git/config添加如下 [credential] helper = store 添加了此项配置之后, github的账号信息就会 ...

  10. [刷题] PTA 7-32 说反话-加强版

    题目描述: 给定一个英语句子,各个单词之间用空格分隔.要求编写程序,将所有单词倒序输出 输入示例: Hello World Here I Come 输出示例: Come I Here World He ...