题目描述

给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出
get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次。

输入

第一行,一个数字N,表示序列长度。
第二行,N个数字,表示a1~aN
第三行,一个数字Q,表示询问个数。
第4~Q+3行,每行四个数字l1,r1,l2,r2,表示询问。
N,Q≤50000
N1≤ai≤N
1≤l1≤r1≤N
1≤l2≤r2≤N
注意:答案有可能超过int的最大值

输出

对于每组询问,输出一行一个数字,表示答案

样例输入

5
1 1 1 1 1
2
1 2 3 4
1 1 4 4

样例输出

4
1


题解

莫队算法

(为了方便,以下使用$S_x(l,r)$代替$get(l,r,x)$)

题目一眼莫队,不过由于一个询问有4个参数,不能直接处理。

考虑将询问拆成前缀相减的形式,即:

$\ \ \ \ \sum\limits_xS_x(l_1,r_1)·S_x(l_2,r_2)\\=\sum\limits_{x}(S_x(1,r_1)-S_x(1,l_1-1))·(S_x(1,r_2)-S_x(1,l_2-1))\\=\sum\limits_{x}(S_x(1,r_1)·S_x(1,r_2)-S_x(1,l_1-1)·S_x(1,r_2)--S_x(1,r_1)·S_x(1,l_2-1)+S_x(1,l_1-1)·S_x(1,l_2-1))\\=Q(r_1,r_2)-Q(l_1-1,r_2)-Q(r_1,l_2-1)+Q(l_1-1,l_2-1)$

其中:

$Q(a,b)=\sum\limits_{x}S_x(1,a)·S_x(1,b)$

于是就可以把每个询问拆成4个,使用莫队算法分别计算对每个答案的贡献即可。

注意当$a$或$b$中某一个为0时的情况需要过滤掉,否则会加入不存在的位置导致挂掉。

时间复杂度$O(n\sqrt{4m})$

#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 50010
using namespace std;
typedef long long ll;
int si , v[N] , cl[N] , cr[N] , tot;
ll ans[N];
struct data
{int l , r , flag , id;data() {}data(int a , int b , int c , int d) {l = min(a , b) , r = max(a , b) , flag = c , id = d;}bool operator<(const data &a)const {return (l - 1) / si == (a.l - 1) / si ? r < a.r : (l - 1) / si < (a.l - 1) / si;}
}a[N << 2];
int main()
{int n , m , i , x1 , y1 , x2 , y2 , lp = 0 , rp = 0;ll now = 0;scanf("%d" , &n) , si = (int)sqrt(n);for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);scanf("%d" , &m);for(i = 1 ; i <= m ; i ++ ){scanf("%d%d%d%d" , &x1 , &y1 , &x2 , &y2) , a[++tot] = data(y1 , y2 , 1 , i);if(x1 > 1) a[++tot] = data(x1 - 1 , y2 , -1 , i);if(x2 > 1) a[++tot] = data(y1 , x2 - 1 , -1 , i);if(x1 > 1 && x2 > 1) a[++tot] = data(x1 - 1 , x2 - 1 , 1 , i);}sort(a + 1 , a + tot + 1);for(i = 1 ; i <= tot ; i ++ ){while(lp < a[i].l) lp ++ , now += cr[v[lp]] , cl[v[lp]] ++ ;while(rp < a[i].r) rp ++ , now += cl[v[rp]] , cr[v[rp]] ++ ;while(lp > a[i].l) cl[v[lp]] -- , now -= cr[v[lp]] , lp -- ;while(rp > a[i].r) cr[v[rp]] -- , now -= cl[v[rp]] , rp -- ;ans[a[i].id] += a[i].flag * now;}for(i = 1 ; i <= m ; i ++ ) printf("%lld\n" , ans[i]);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7597573.html

【bzoj5016】[Snoi2017]一个简单的询问 莫队算法相关推荐

  1. bzoj 5016: [Snoi2017]一个简单的询问(莫队)

    5016: [Snoi2017]一个简单的询问 Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 87  Solved: 64 [Submit][Sta ...

  2. [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

    一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...

  3. 曼哈顿距离最小生成树莫队算法

    参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...

  4. 莫队算法(小Z的袜子)

    目前的题型概括为三种:普通莫队,树形莫队以及带修莫队. 例题一:小Z的袜子 ·述大意: 进行区间询问[l,r],输出该区间内随机抽两次抽到相同颜色袜子的概率. ·分析: 对于L,R的询问.设其中颜色为 ...

  5. 普通、带修(可持久化)莫队算法入门例题详解

    目录 [莫队算法] [普通莫队] [代码] [题面] [带修莫队] [代码] [题面] [总结] [莫队算法] 参考大米饼的莫队算法 ,目前的题型概括为三种:普通莫队,带修莫队以及树形莫队. [普通莫 ...

  6. C++ 莫队算法(转)

    胡小兔的良心莫队教程:莫队.带修改莫队.树上莫队 在开始学习莫队之前,照例先甩一道例题:BZOJ 1878 HH的项链. 题意:求区间内数的个数,相同的数只算一次. 在我关于这道题的上一篇题解中,我使 ...

  7. 数列互质(莫队算法)

    数列互质 题目描述 给出一个长度为 n 的数列 { a[1] , a[2] , a[3] , - , a[n] },以及 m 组询问 ( l[i] , r[i] , k[i]). 求数列下标区间在 [ ...

  8. 曼哈顿距离最小生成树与莫队算法(总结)

    曼哈顿距离最小生成树与莫队算法(总结) 1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下:  给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价.  朴 ...

  9. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

最新文章

  1. 对不起,让你笑了这么久!
  2. Android Design Library之三: NavigationView
  3. 枚举--遍历搜索空间的例子:熄灯问题
  4. python(numpy,pandas3)——numpy索引
  5. Day14作业 三、编程题 写一个Student类,属性:名字,年龄,分数,班级 (注意分包)
  6. C和指针之字符串编程练习3
  7. 【模型加速】TensorRT详解
  8. android摄像头的autoFocus-----循环自动聚焦的实现
  9. HashMap源码剖析(代码基于JDK11)
  10. vue-cli搭建项目引入jquery和jquery-weui步骤详解
  11. ubuntu16.04安装完后无法上网
  12. Django基于admin的stark组件创建(一)
  13. 面试题:460道Java后端面试高频题答案版「模块九:Spring」
  14. Swift WKWebView详细解读
  15. djangoday18
  16. 做一个展示型企业网站要多少钱
  17. springboot踩坑日记-java: User-specified option “-proc:none“ is ignored for “xxx-xxx-common“. This compil
  18. 【Mark Schmidt课件】线性代数
  19. 游戏手柄HID描述符
  20. 用OpenCV调用IP摄像头(python版)

热门文章

  1. Windows 技术篇 - windows日期和时间设置里没有Internet 时间页签原因和解决方法
  2. Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)
  3. CTFshow 命令执行 web55
  4. [YTU]_2424 C语言习题 字符串比较
  5. Dogleg“狗腿”最优化算法
  6. java 自定义 operator_java8 自定义Collector
  7. 深度学习 load_data_fashion_mnist
  8. 接口压测初识java GC
  9. jQuery操作css样式、属性、动画、节点
  10. QT开发(十二)——QT事件处理机制