Strange Queries(莫队)
You are given an array with n integers a1, a2, ..., an, and q queries to answer.
Each query consists of four integers l1, r1, l2 and r2. Your task is to count the number of pairs of indices (i, j) satisfying the following conditions:
ai = aj
l1 ≤ i ≤ r1
l2 ≤ j ≤ r2
Input
The first line of the input contains an integer n (1 ≤ n ≤ 50 000) — the size of the given array.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n).
The third line contains an integer q (1 ≤ q ≤ 50 000) — the number of queries.
Each of the next q lines contains four integers l1, r1, l2, r2 (1 ≤ l1 ≤ r1 ≤ n, 1 ≤ l2 ≤ r2 ≤ n), describing one query.
Output
For each query count the number of sought pairs of indices (i, j) and print it in a separate line.
Examples
Input
7
1 5 2 1 7 2 2
8
1 3 4 5
2 3 5 7
1 4 3 7
2 6 4 7
1 6 2 5
3 3 6 7
4 5 1 4
2 3 4 5
Output
1
2
5
6
6
2
2
0
题目:
您将获得一个包含n个整数a1,a2,...,an和q查询的数组。
每个查询由四个整数l1,r1,l2和r2组成。您的任务是计算满足以下条件的索引对(i,j)的数量:
$ a_i = a_j $
L1 ≤ i ≤ R1
L2 ≤ j ≤ R2
输入
输入的第一行包含一个整数n(1≤N≤50 000) -给定阵列的大小。
第二行包含n个整数a1,a2,...,a(1≤ai≤n)。
第三行包含一个整数q(1≤q≤50000) - 查询数。
接下来的q行中的每一行包含四个整数l1,r1,l2,r2(1≤l1≤r1≤n,1≤l2≤r2≤n),描述一个查询。
输出
对于每个查询计数所寻求的索引对(i,j)的数量,并将其打印在单独的行中。
示例输入
7
1 5 2 1 7 2 2
8
1 3 4 5
2 3 5 7
1 4 3 7
2 6 4 7
1 6 2 5
3 3 6 7
4 5 1 4
2 3 4 5
示例输出
1
2
5
6
6
2
2
0
仔细观察题目我们不难发现这题我们需要维护两个区间内元素的出现次数
嗯?这不是裸裸的莫队吗?等等,两个\(50000\)的区间,我不敲时谁敲时?
这谁做得出啊??干脆维护一个区间算了,暴力枚举第二个区间算了!!
于是某年某月某日某蒟蒻以2000毫秒的好成绩卡了过去:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
struct su{
int l,r,ll,rr,t;
}k[50001];
long long now;
int z[50001];
int s[50001];
int tot[50001];
int tot2[50001];
long long ans[50001];
int n,m,q,f,l=1,r,ll=1,rr;
inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
inline bool cmp(su x,su y){
return z[x.l]==z[y.l]?x.r<y.r:x.l<y.l;
}
inline void add(int x,int y){
now-=(long long)tot2[x]*tot[x];
tot[x]+=y;
now+=(long long)tot2[x]*tot[x];
}
inline void add2(int x,int y){
now-=(long long)tot[x]*tot2[x];
tot2[x]+=y;
now+=(long long)tot[x]*tot2[x];
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr();
f=sqrt(n-1)+1;
for(rg i=1;i<=n;++i) s[i]=qr();
for(rg i=1,j=1;i<=n;++i)
z[i]=i%f==0?j++:j;
m=qr();
for(rg i=1;i<=m;++i){
k[i].l=qr();
k[i].r=qr();
k[i].ll=qr();
k[i].rr=qr();
k[i].t=i;
}
sort(k+1,k+m+1,cmp);
for(rg i=1;i<=m;++i){
while(l<k[i].l)add(s[l],-1),++l;
while(k[i].l<l)add(s[l-1],1),--l;
while(r<k[i].r)add(s[r+1],1),++r;
while(k[i].r<r)add(s[r],-1),--r;
while(ll<k[i].ll)add2(s[ll],-1),++ll;
while(k[i].ll<ll)add2(s[ll-1],1),--ll;
while(rr<k[i].rr)add2(s[rr+1],1),++rr;
while(k[i].rr<rr)add2(s[rr],-1),--rr;
ans[k[i].t]=now;
}
for(rg i=1;i<=m;++i)
printf("%lld\n",ans[i]);
return 0;
}
Strange Queries(莫队)的更多相关文章
- CFGym101138D Strange Queries 莫队/分块
正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...
- XOR Queries(莫队+trie)
题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...
- Sona && Little Elephant and Array && Little Elephant and Array && D-query && Powerful array && Fast Queries (莫队)
vjudge上莫队专题 真的是要吐槽自己(自己的莫队手残写了2个bug) s=sqrt(n) 是元素的个数而不是询问的个数(之所以是sqrt(n)使得左端点每个块左端点的范围嘴都是sqrt(n)) 在 ...
- CodeForces 375D Tree and Queries 莫队||DFS序
Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...
- cf375D. Tree and Queries(莫队)
题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...
- [Codeforces375D]Tree and Queries(莫队算法)
题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...
- Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥
传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...
- LightOJ 1188 Fast Queries(简单莫队)
1188 - Fast Queries PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB Gi ...
- CodeForces 376F Tree and Queries(假·树上莫队)
You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...
随机推荐
- 微软职位内部推荐-Senior Software Development Engineer_Commerce
微软近期Open的职位: Are you looking for a high impact project that involves processing of billions of dolla ...
- C++ 继承和派生介绍
继承(inheritance)是软件重用的一种方式,程序员通过继承可以吸收已有类的数据和行为来创建新类,并可以添加新的数据和行为来增强类的功能.创建新类时,并不需要创建全新的数据和成员函数,我们可以指 ...
- BugPhobia准备篇章:团队Beta阶段准备工作分析
0x00:序言 To the searching tags, you may well fall in love withhttp://xueba.nlsde.buaa.edu.cn/ 再见,无忧时光 ...
- 第二阶段冲刺——two
个人任务: 王金萱:优化作业查询结果,按学号排列. 马佳慧:测试登录功能并优化. 司宇航:修复博客作业查询功能. 季方:测试博客作业查询功能. 站立会议: 任务看板和燃尽图:
- do
http://www.cnblogs.com/xdp-gacl/p/3791993.html http://blog.sina.com.cn/s/blog_95c8f1ac010198j2.html
- [转帖]Vim编辑器使用方法详解
Vim编辑器使用方法详解 程序员小新人学习 2018-12-16 12:26:23 转载于https://www.cnblogs.com/libaoliang/articles/6961676.htm ...
- Linux 使用NC命令永久监听本地端口
感谢: 冰点阳光 Linux可以使用nc命令来测试网络端口是否正常,类似于telnet命令,但也可以用nc命令来监听本地端口,支持TCP.UDP协议,当我们测试NTP服务网络策略是否正常时,可以使用到 ...
- Android studio Gradle编译错误: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Reques
两种处理方法: 1.修改distributionUrl链接 gradle-wrapper.properties文件 distributionUrl=https\://services.gradle.o ...
- 如何使用js判断视频是否可以成功访问
日常工作中会出现各个公司网络不互通的情况,视频如果采用不互通的地址也无法播放,下面方法提供了检测视频是否可以播放的解决方案: 1.跨域 var video = document.createEleme ...
- Struts2 分割字符串标签s:generator
有些时候会从后台返回一个字符串,可以通过Strut2的标签s:generator进行分割. generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串.生成的多个字串可以用iterato ...