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 ...
随机推荐
- odoo开发笔记 -- 官方模块一览表
模块名称 技术名称 作者 电子发票管理 account OpenERP SA 会计与财务 account_accountant OpenERP SA 合同管理 account_analytic_ana ...
- IE不兼容document.getElementsByClassName
在DOM3里已经加入了getElementsByClassName这个方法,然而IE9.10以外的其它版本均不支持,这是一块伤痛啊! 目前可以这么解决,判断浏览器支不支持这个方法,如果支持就不管:如果 ...
- sizeof()与Marshal.SizeOf()的不同
在.NET中一般都是通过sizeof()或Marshal.SizeOf()来获取数据类型的大小,来简要地看一下它们二者有何不同. sizeof() sizeof()在MSDN中的介绍是,在编译时获得一 ...
- php获取全选checkbox多个值
<form name="myform" action="index2.php" method="post"> ...
- 配置Zookeper
在整个的codis架构之中,codis-proxy将作为所有的codis-server的对外的代理,而在整个的处理之中,codis-proxy所保存的数据一定是所有的codis-server的信息,那 ...
- WPF中Grid的行的Height和列的Width根据内容自适应
Grid中RowDefinition的Height和ColumnDefinition的设置都有三种: 1. 具体数值,固定不变: 2. * 星号,如: 2*,5*,8*: 分母为(2+5+8=15), ...
- redis学习(五) redis过期时间
redis过期时间 1.redis过期时间介绍 有时候我们并不希望redis的key一直存在.例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁.redis提供了一些命令,能够让我们对ke ...
- 复刻smartbits的国产网络测试工具minismb-如何添加数据流
复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...
- 微服务之kong+consul(二)
一.kong 1.使用kong来做服务网关,目前kong使用的是0.13版本现在地址:https://docs.konghq.com/install,kong的社区版没有dashboard,可以使用k ...
- 项目复审——Alpha阶段
Deadline: 2018-5-19 10:00PM,以提交至班级博客时间为准. 5.10实验课上,以(1.2班级,3.4班级为单位)进行项目复审.根据以下要求,完成本团队对其他团队的复审排序. 参 ...