这种不可直接做的问题

数据范围又很小

考虑莫队

但是,l1,l2,r1,r2四维?

考虑把询问二维差分!

f(a,b)表示,询问[1,a],[1, b]的答案

所以,ans(l1,r1,l2,y2)=f(r1,r2)-f(l1-1,r2)-f(r1,l2-1)+f(l1-1,l2-1)

正确性的话,考虑每一个种类k被统计的情况,c*d=(a+b)*(c+d)-a*(c+d)-c*(a+b)+a*b

需要离散化

数组开4倍

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,m;
int a[N];
int blo[N];
int b[N];
ll ans[N];
struct que{
int l,r;
int c,id;
que(){}
que(int ll,int rr,int cc,int dd){
if(ll>rr) swap(ll,rr);
l=ll;r=rr;c=cc;id=dd;
}
bool friend operator <(que a,que b){
if(blo[a.l]==blo[b.l]){
if(blo[a.l]&) return a.r<b.r;
return a.r>b.r;
}
return blo[a.l]<blo[b.l];
}
}q[*N];
int tot;
int buc[][N];
ll now;
int l,r;
void dele(int d,int c){
now-=buc[d^][c];
buc[d][c]--;
}
void add(int d,int c){
now+=buc[d^][c];
buc[d][c]++;
}
void modui(){
l=;r=;now=;
for(reg i=;i<=tot;++i){
while(l<q[i].l) ++l,add(,a[l]);
while(l>q[i].l) dele(,a[l]),--l;
while(r<q[i].r) ++r,add(,a[r]);
while(r>q[i].r) dele(,a[r]),--r;
ans[q[i].id]+=(ll)now*q[i].c;
}
}
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(a[i]);
blo[i]=(i-)/+;
b[i]=a[i];
}
sort(b+,b+n+);
int cnt=unique(b+,b+n+)-b-;
for(reg i=;i<=n;++i){
a[i]=lower_bound(b+,b+cnt+,a[i])-b;
//cout<<" a[i] "<<a[i]<<endl;
}
rd(m);
int l1,l2,r1,r2;
for(reg i=;i<=m;++i){
rd(l1);rd(r1);rd(l2);rd(r2);
if(l1>&&l2>) q[++tot]=que(l1-,l2-,,i);
if(l1>) q[++tot]=que(l1-,r2,-,i);
if(l2>) q[++tot]=que(r1,l2-,-,i);
q[++tot]=que(r1,r2,,i);
}
sort(q+,q+tot+);
modui();
for(reg i=;i<=m;++i){
printf("%lld\n",ans[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/27 22:24:01
*/

询问的二维拆分有点意思!

以前并没有遇到这种问题(最多就是一维差分)

之前莫队都是(l,r)这种

如果可以前缀差分的话,那么多个(li,ri)都是可以的

本质就是容斥,或者高维差分

bzoj5016 一个简单的询问的更多相关文章

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

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

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

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

  3. loj #2254. 「SNOI2017」一个简单的询问

    #2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...

  4. 「SNOI2017」一个简单的询问

    「SNOI2017」一个简单的询问 简单的解法 显然可以差分一下. \[get(l,r,x)\times get(l1,r1,x)=get(1,r,x) \times get(1,r1,x)-get( ...

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

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

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

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

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

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

  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. WinDbg使用学习

    拿到软件崩溃之后产生的crash文件,后缀名为dump 使用winDbg的File-----> Open Crash Dump 打开Crash文件 File---------> Symbo ...

  2. 新手Python第四天(生成器)

    Python 生成器 生成器和生成表达式 a=[i*2 for i in range(10)]#生成表达式 b=(i*2 for i in range(10))#生成器 生成器的特点:优点(不占用内存 ...

  3. 小刘的深度学习---Faster RCNN

    前言: 对于目标检测Faster RCNN有着广泛的应用,其性能更是远超传统的方法. 正文: R-CNN(第一个成功在目标检测上应用的深度学习的算法) 从名字上可以看出R-CNN是 Faster RC ...

  4. 笨办法学Python - 习题8-10: Printing & Printing, Printing

    目录 1.习题 8: 打印,打印 2.习题 9: 打印,打印,打印 3.习题 10: 那是什么? 3.1.转义序列: 4.习题总结: 1.习题 8: 打印,打印 学习目标:继续学习 %r 的格式化输出 ...

  5. [转载]GBK 汉字内码扩展规范编码表(1.0 版)

    编码表源地址:http://ff.163.com/newflyff/gbk-list/ 编码在线查询:http://www.qqxiuzi.cn/bianma/zifuji.php GBK 汉字内码扩 ...

  6. mysql 伪列

    select  @rownum:=@rownum+1 AS rownum,b.* from (SELECT @rownum:=0) r ,goods_description_new  b

  7. caffe 预训练 或者Fine-Tuning 操作

    1.使用预训练模型,需要修改训练的prototxt,将layer name改为与要使用模型的layer name相同即可. Borrowing Weights from a Pretrained Ne ...

  8. 欢迎来怼--第三十六次Scrum会议

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/1 11:35~11:55,总计20min. 地点 ...

  9. Daily Scrumming 2015.10.20(Day 1)

    一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 购买服务器,搭建服务器,配置服务器端用户与权限管理 配置ruby与rails环境 配置mysql与数据 ...

  10. MathExam作业

    作业 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 50 40 • Estimate • ...