Description

给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出

get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次。

Input

第一行,一个数字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的最大值
Output

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

5
1 1 1 1 1
2
1 2 3 4
1 1 4 4
Sample Output

4
1
HINT

Source

这个鬼题搞了好久啊,%%%wfj_2048,数据范围给人一种莫队的感觉;

我们考虑把询问转化为前缀和形式:

然后我们考虑如何解决:

假设r1<=r2,那么我们得到下面一个式子:

然后我们记:

get(1,r1,x)=ret[x],

get(1,r2,x)-get(1,r1+1,x)为tmp[x] (tmp[x]为区间(r1,r2]中x的数目,这是经典莫队问题);

那么答案变为:

然后我们把r1记为l,r2记为r来考虑莫队算法O(1)转移:

如果左端点往左移,设移动后的颜色为x:

那么ret[x]--,tmp[x]++,颜色x的贡献值变为 (ret[x]-1)^2+(tmp[x]+1)*(ret[x]-1);

那么变化为-ret[x]-tmp[x];

如果右端点往右移,设移动后的颜色为x:

那么tmp[x]++,变化值为+ret[x];

其余移动类似,然后考虑到边界条件,需要把询问变为左开右闭,(即l++)

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=500050;
struct data{
int l,r,id,flg;
}q[N];
int a[N],ret[N],tmp[N],n,pos[N],block,tot,m;
ll ans[N],Ans;
bool cmp(const data &a,const data &b){
if(pos[a.l]==pos[b.l]) return a.r<b.r;
else return pos[a.l]<pos[b.l];
}
void addl(int x){Ans+=(-ret[x]-tmp[x]);ret[x]--,tmp[x]++;}
void dell(int x){Ans+=(ret[x]+tmp[x]);ret[x]++;tmp[x]--;}
void addr(int x){Ans+=ret[x];tmp[x]++;}
void delr(int x){Ans+=(-ret[x]);tmp[x]--;}
void Modui(){
Ans=0;
for(int l=1,r=0,i=1;i<=tot;i++){
while(l>q[i].l) l--,addl(a[l]);
while(r<q[i].r) r++,addr(a[r]);
while(l<q[i].l) dell(a[l]),l++;
while(r>q[i].r) delr(a[r]),r--;
ans[q[i].id]+=Ans*q[i].flg;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
q[++tot]=(data){r1,r2,i,1};
q[++tot]=(data){r1,l2-1,i,-1};
q[++tot]=(data){l1-1,r2,i,-1};
q[++tot]=(data){l1-1,l2-1,i,1};
}
for(int i=1;i<=tot;i++){
if(q[i].l>q[i].r) swap(q[i].l,q[i].r);
q[i].l++;
}
block=sqrt(n);
for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
sort(q+1,q+1+tot,cmp);Modui();
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}

bzoj 5016: [Snoi2017]一个简单的询问的更多相关文章

  1. bzoj P5016[Snoi2017]一个简单的询问——solution

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

  2. [SNOI2017]一个简单的询问

    [SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...

  3. 【BZOJ5016】[Snoi2017]一个简单的询问 莫队

    [BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...

  4. Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥

    传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...

  5. bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...

  6. [bzoj5016][Snoi2017]一个简单的询问

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出   get(l,r,x)表示计算区间[l,r]中 ...

  7. [SNOI2017]一个简单的询问【莫队+容斥原理】

    题目大意 给你一个数列,让你求两个区间内各个数出现次数的乘积的和. 分析 数据范围告诉我们可以用莫队过. 我并不知道什么曼哈顿什么乱七八糟的东西,但是我们可以用容斥原理将这个式子展开来. \[\sum ...

  8. BZOJ5016:[SNOI2017]一个简单的询问(莫队)

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

  9. 【bzoj5016】[Snoi2017]一个简单的询问 莫队算法

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

随机推荐

  1. 2735:八进制到十进制-poj

    总时间限制:  1000ms 内存限制:  65536kB 描述 把一个八进制正整数转化成十进制. 输入 一行,仅含一个八进制表示的正整数a,a的十进制表示的范围是(0, 65536). 输出 一行, ...

  2. Servlet中web.xml 以及 <url-pattern>总结

    web.xml中添加Servlet配置信息 使用Eclipse创建Servlet,会自动的在WEB-INF下的web.xml中声明,但是有的时候需要我们手动的写入配置信息,以下就是Servlet在we ...

  3. 一个for循环打印二维数组

    #include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...

  4. Core 核心标签库->运算式操作

    jstl--->Core 核心标签库->运算式操作  -->out.remove.set.catch <c:out>:用来显示资料的内容 语法1:没有本体的内容 < ...

  5. CCF-201503-3-节日

    问题描述 试题编号: 201503-3 试题名称: 节日 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有一类节日的日期并不是固定的,而是以"a月的第b个星期c&q ...

  6. 直播二:iOS中硬编码(VideoToolBox)

    硬编码相对于软编码来说,使用非CPU进行编码,如显卡GPU.专用的DSP.FPGA.ASIC芯片等,性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等). 在iOS8之后,苹果开放了接口,并 ...

  7. javaweb学习总结(四)——Http协议(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3751277.html 一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传 ...

  8. hdu1754 I Hate It (线段树 更新点的值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 授权远程连接MySQL(Linux)

    MySQL远程訪问的命令 格式: mysql -h主机地址 -uusername -p用户password 首先在目标服务器上(115.159.66.51)改动mysql的my.cnf文件: 改动退出 ...

  10. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 .第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的吗 ...