莫队模板

https://vjudge.net/problem/SPOJ-DQUERY

此题连接;

题目大意:给出一个n个数的序列;

接下来有k个询问,每一次询问某一区间里的不同数的个数;

莫队思想:分块 排序 暴力;先将所有询问存储起来,然后玄学排序降低复杂度;

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<math.h>
 4 #include<string.h>
 5 #include<queue>
 6 using namespace std;
 7 const int maxn=1e4+10;
 8 int vis[maxn*100];
 9 int a[maxn*3];
10 int temp;  //记录每一个区间的不同数的总数;
11 int block; //分块
12 int ans[maxn*20];
13 struct node
14 {
15     int l,r,id;
16 }query[maxn*20];
17 bool cmp(node x,node y)
18 {
19     if(x.l/block!=y.l/block)
20         return x.l<y.l;
21     if(x.l/block&1)        //使用波形排序,可进一步的优化
22         return x.r<y.r;
23     return x.r>y.r;
24 }
25 void add(int x)
26 {
27     if(!vis[x]) temp++;
28     vis[x]++;
29 }
30 void Delete(int x)
31 {
32     if(vis[x]==1) temp--;
33     vis[x]--;
34 }
35 int main()
36 {
37     int n,q;
38     scanf("%d",&n);
39     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
40     scanf("%d",&q);
41     for(int i=1;i<=q;i++){
42         scanf("%d%d",&query[i].l,&query[i].r);
43         query[i].id=i;
44     }
45     block=sqrt(n);
46     temp=0;
47     sort(query+1,query+1+q,cmp);
48     int left=1,right=1;
49     add(a[1]);
50     for(int i=1;i<=q;i++){
51         while(left<query[i].l) Delete(a[left++]);
52         while(left>query[i].l) add(a[--left]);
53         while(right>query[i].r)Delete(a[right--]);
54         while(right<query[i].r)add(a[++right]);
55         ans[query[i].id]=temp;
56     }
57     for(int i=1;i<=q;i++)
58         printf("%d\n",ans[i]);
59     return 0;
60 }

原文地址:https://www.cnblogs.com/pangbi/p/11538053.html

时间: 2024-11-06 20:16:30

莫队模板的相关文章

P1494 [国家集训队]小Z的袜子 莫队模板

链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜色相

数颜色(带修莫队模板)

数颜色(luogu) Description 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 为了满足墨墨的要求,你知道你需要干什么了吗? 输入格式 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数. 第2行N个整数,分别代表初始画笔排中第i支画笔的颜色. 第3行到第2+M行

[SDOI2009][bzoj1878] HH的项链 [莫队模板题]

题面: 传送门 思路: 就是一道莫队的模板题目...... 开一个1000000的数组记录每个数出现的次数,然后每次从1到0或者从0到1更新答案 莫队讲解看这里:莫队 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 inline int

莫队算法小结(Markdown版)

wtf,最近挖坑有点小多啊,没办法>_<容我先把糖果公园A了再来写这个吧= =看看今天能不能A掉 好吧,我承认我第二天才把糖果公园A掉>_<下面把这篇小结补上 首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序 复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料 下面举几个例子详细说明 1.小Z的袜子 Description: 给定一个序列m个询问 每次询问: 区间中选两个数,两个数相等的概率 若概率为0则输出01 仔细观察发现,令x表示x这个值出现的次

莫队算法小总结 x

莫队这东西...orz 可用于解决一类可离线且在得到区间[l,r]的答案后,能在O(1)或O(log2n)得到区间[l,r+1]或[l−1,r]的答案的问题 我们先来看这样一个问题: 给出n个数字,m次询问,每次询问在区间[li,ri]之间任选两个数字相等的概率是多少.(n,q<=50000)(小z的袜子) 在区间[l,r]中,这个概率是: ∑vi=1C(2,f(i)) ----------------- C(2,r−l+1) (v表示数字值,f(i)表示数字i在区间内出现的次数) 由于没有加和

莫队算法小结

唔,想有更加舒爽的阅读体验请移步http://mlz000.logdown.com/posts/252433-mo-algorithm-summary 首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序 复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料 下面举几个例子详细说明 1.小Z的袜子 Description: 给定一个序列m询问 每次询问: 区间中选两个数,两个数相等的概率 若概率为则输出0/1 仔细观察发现,令x表示x个值出现的次数,则每次询问[l,r]区

【Luogu】P1903数颜色(带修改莫队)

题目链接 带修改莫队模板. 加一个变量记录现在是第几次修改,看看当前枚举的询问是第几次修改,改少了就改过去,改多了就改回来. 话说我栈用成队列了能过样例?!!!! 从此深信一句话:样例是出题人精心设计的,绞尽脑汁才设计出一个能让错误代码通过的数据qwqqqqq #include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cstring> #inc

SPOJ DQUERY D-query(莫队基础题)

题目链接:http://www.spoj.com/problems/DQUERY/ 题目: Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subs

【WC2013】 糖果公园 - 树上莫队

[问题描述] Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 1 至 n.有 n – 1 条 双向道路 连接着这些游览点,并且整个糖果公园都是 连通的 ,即从任何一个游览点出发都可以通过这些道路到达公园里的所有其它游览点.糖果公园所发放的糖果种类非常丰富,总共有 m 种,它们的编号依次为 1至 m.