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 ...
随机推荐
- c++中的const和volatile知识自我总结
学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...
- 【sping揭秘】6、IOC容器之统一资源加载策略
Spring中的resource 我们先看看类之间的关系 注意我们的application是间接继承了resourceloader的,也就是说我们的application其实就是一个resourcel ...
- Scala之隐式转换implicit详解
假设我们有一个表示文本的行数的类LineNumber: class LineNumber ( val num : Int ) 我们可以用这个类来表示一本书中每一页的行数: val lineNumOfP ...
- SQL语句:Mac 下 处理myql 不能远程登录和本地登录问题
mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@'localhost' (using password: YES) ()里面的为she ...
- VS和Eclipse的调试功能哪个更强大?
以前一直用VS 2012来调试C/C++代码,F5.F10.F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C+ ...
- Collections.sort()中的mergeSort归并排序
@SuppressWarnings({"unchecked", "rawtypes"}) private static void mergeSort(Objec ...
- 简述serializable和transient关键字作用
transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...
- [Python学习笔记-001] 内置函数getattr()
如果某个实例foo有多个方法, 当对foo的每一个方法我们都需要使用try ... except ...进行包装的时候,内置函数getattr()可以用来精简代码. 1. getattr()的用法 # ...
- Java并发编程-synchronized指南
在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访 ...
- OSI与TCP/IP模型
1 OSI参考模型 谈到网络不能不谈OSI参考模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考.在现实网络世界里,T ...