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

Input
一开始看错了题,以为是每次询问一个x,
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int sz,N,Q,num;
int a[];
LL MAP[][],inlineMAP[];
LL ANS[];
struct ss{
int L,R,pos,id;
LL flag;
}qrr[];
LL ans[];
bool cmp(ss a,ss b){
return a.pos<b.pos;
}
LL get(int ,int );
int main()
{
int i,j,k;
scanf("%d",&N);
sz=sqrt(N);
for(i=num=;i<=N;i+=sz,num++){
for(j=i;j<i+sz&&j<=N;j++){
scanf("%d",&a[j]);
MAP[num][a[j]]++;
}
}
num--;
scanf("%d",&Q);
for(i=;i<=Q;i++){
scanf("%d%d%d%d",&qrr[i].L,&qrr[i].R,&qrr[i].pos,&qrr[i+Q].pos);
qrr[i+Q].L=qrr[i].L,qrr[i+Q].R=qrr[i].R;
qrr[i+Q].id=qrr[i].id=i;
qrr[i].flag=-,qrr[i+Q].flag=;
qrr[i].pos--;
}
sort(qrr+,qrr+Q+Q+,cmp);
j=;
for(i=;i<=Q<<;i++){
while(j<qrr[i].pos){
j++;
inlineMAP[a[j]]++;
for(k=;k<=num;k++)
ANS[k]+=MAP[k][a[j]];
}
ans[qrr[i].id]+=qrr[i].flag*get(qrr[i].L,qrr[i].R);
}
for(i=;i<=Q;i++)
printf("%lld\n",ans[i]);
return ;
}
LL get(int L,int R){
LL ret=;
int i,j,k;
int l,r;
if(R-L+<=sz){
for(i=L;i<=R;i++)
ret+=inlineMAP[a[i]];
return ret;
}
for(i=j=;i<L;i+=sz,j++);
l=i-;
for(;i+sz<=R+&&i<=N;j++,i+=sz)
ret+=ANS[j];
r=i;
for(i=L;i<=l;i++)
ret+=inlineMAP[a[i]];
for(i=r;i<=R;i++)
ret+=inlineMAP[a[i]];
return ret;
}
或许有树套树的做法?
bzoj P5016[Snoi2017]一个简单的询问——solution的更多相关文章
- bzoj 5016: [Snoi2017]一个简单的询问
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...
- [SNOI2017]一个简单的询问
[SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...
- 【BZOJ5016】[Snoi2017]一个简单的询问 莫队
[BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...
- Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥
传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...
- BZOJ5016:[SNOI2017]一个简单的询问(莫队)
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...
- [bzoj5016][Snoi2017]一个简单的询问
来自FallDream的博客,未经允许,请勿转载,谢谢. 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中 ...
- [SNOI2017]一个简单的询问【莫队+容斥原理】
题目大意 给你一个数列,让你求两个区间内各个数出现次数的乘积的和. 分析 数据范围告诉我们可以用莫队过. 我并不知道什么曼哈顿什么乱七八糟的东西,但是我们可以用容斥原理将这个式子展开来. \[\sum ...
- 【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
题目描述 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. 输入 第一行,一个数字N,表 ...
- bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...
随机推荐
- 整理版jq 复习贴子
1绝对定位(abs)与相对定位(relative) 区别是相对定位参照自己的位置进行移动(当然需要设置top left这些生效)并且原来的位置保留着 偏移后会把 其它的层遮罩住 绝对定位就是的参照位置 ...
- web socket 入门
WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其优雅地解决了以往web服务器不能向web客户端实时推送消息的问题. 在浏览器js环境中,创建一个websock ...
- 关于c++类的一些知识的总结
1.经常会听到“类的声明.类的定义.类的实现”,它们之间有什么不一样? 经过查阅https://www.cnblogs.com/kkshaq/p/4660073.html博客的说法,类的声明是在.h文 ...
- 【原创】Dependency Walker
https://zh.wikipedia.org/wiki/Dependency_Walker For situations where the system says it can’t find s ...
- Day.js - JavaScript时间处理库
Day.js简介 在使用JavaScript处理时间方面,使用的时Moment.js,但是它太重了,有200多k,一般项目中可能也只是用了几个api而已,所以,这里推荐一个轻量的时间库 - Day.j ...
- 使用makefile
最近在学习一个处理二维相场问题的c++程序,遇到了makefile文件,之前没有接触过,这里做一个简单的整理. 什么是makefile? 大多程序员使用的windows操作系统,IED都完成了make ...
- 分享一套简单的CodeSmith三层模板
如果要连接mysql,需要安装驱动: https://cdn.mysql.com//Downloads/Connector-Net/mysql-connector-net-8.0.12.msi 连接字 ...
- GO入门——5. 函数
1 函数 Go 函数 不支持 嵌套.重载和默认参数 定义函数使用关键字 func,且左大括号不能另起一行 函数也可以作为一种类型使用 无需声明原型 不定长度变参 func A(a string,c . ...
- JavaScript创建对象的方法汇总
JavaScript中的对象 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特性顺序的值.对象的每一个属性或方法都有一个名字 ...
- idea @Override is not allowed when implementing interface method
转自:http://blog.csdn.net/shenya2/article/details/50460447 在编码过程发现报错:@Override is not allowed when imp ...