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

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

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

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

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

T1

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

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

T2

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

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

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

    [deerhang] 创建对象的四种方式:new关键字.反射.Object.clone().unsafe方法 new和反射是通过调用构造器创建对象的,创建对象的时候使用invokespecial指令 ...

  2. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  3. CVPR2021| TimeSformer-视频理解的时空注意模型

    前言: transformer在视频理解方向的应用主要有如下几种实现方式:Joint Space-Time Attention,Sparse Local Global Attention 和Axial ...

  4. 一道codeforces题目引发的差分学习

    Codeforces Round #688 (Div. 2) 题目:B. Suffix Operations 题意:给定一个长为n的数组a,你可以进行两种操作:1).后缀+1;     2)后缀-1: ...

  5. Python数模笔记-NetworkX(3)条件最短路径

    1.带有条件约束的最短路径问题 最短路径问题是图论中求两个顶点之间的最短路径问题,通常是求最短加权路径. 条件最短路径,指带有约束条件.限制条件的最短路径.例如,顶点约束,包括必经点或禁止点的限制:边 ...

  6. [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]

    [并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...

  7. [Java] Structs

    背景 基于MVC的WEB框架 在表示层过滤访问请求并处理 步骤 在eclipse中创建Web动态项目 导入相关jar包到WEB-INF/lib 在WEB-INF目录下新建web.xml,配置Filte ...

  8. Linux netperf网络性能测试

    Linux netperf网络性能测试 (2013-10-14 16:07:48) 转载▼     网络性能测量的五项指标 1. 可用性(availability) 测试网络性能的第一步是确定网络是否 ...

  9. too many open files问题详解

    too many open files问题详解 feelgood3000关注0人评论2616人阅读2018-08-23 09:47:52   一  单个进程打开文件句柄数过多 ulimit中的nofi ...

  10. Chrome 红色和 Chromium蓝色 区别:logoChrome 红色和 Chromium蓝色;Chrome闭源和 Chromium开源;

    我们知道Chromium采用的BSD开源协议(Chromium首页.文档和下载),google chrome是闭源的("9.2 根据第 1.2 条规定,除非法律明确允许或要求,或经谷歌明确书 ...