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

Input
Output
Sample Input
1 1 1 1 1
2
1 2 3 4
1 1 4 4
Sample Output
1
题解:先将询问的l--,然后我们开始推式子喽!为了方便起见,下面用s(i)表示get(1,i,x)。那么:
$ans=\sum\limits_{x}(s(r1)-s(l1))*(s(r2)-s(l2)))\\=\sum\limits_{x}s(r1)*s(r2)+s(l1)*s(l2)-s(l1)*s(r2)-s(r1)*s(l2)\\*ab={(a+b)^2-a^2-b^2\over 2}*\\=\sum\limits_{x}{(s(r1)^2+s(r2)^2-(s(r2)-s(r1)))^2+s(l1)^2+s(l2)^2-(s(l2)-s(l1))^2+(s(r2)-s(l1))^2-s(r2)^2-s(l1)^2+(s(r1)-s(l2))^2-s(r1)^2-s(l2)^2\over 2}\\=\sum\limits_{x}{(s(r1)-s(l2))^2+(s(r2)-s(l1))^2-(s(l2)-s(l1))^2-(s(r2)-s(r1))^2\over 2}$
然后用莫队处理区间中每个数出现次数的平方即可!
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=50010;
struct node
{
int a,b,org,k;
node() {}
node(int x,int y,int c,int d){a=min(x,y)+1,b=max(x,y),org=c,k=d;}
}q[maxn<<2];
int s[maxn],v[maxn];
int n,m,B;
ll sum,ans[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(node a,node b)
{
return (a.a/B==b.a/B)?(a.b<b.b):(a.a/B<b.a/B);
}
int main()
{
n=rd(),B=int(sqrt(double(n)));
int i,a,b,c,d,l,r;
for(i=1;i<=n;i++) v[i]=rd();
m=rd();
for(i=1;i<=m;i++) a=rd()-1,b=rd(),c=rd()-1,d=rd(),
q[i]=node(a,c,i,-1),q[i+m]=node(b,d,i,-1),q[i+2*m]=node(a,d,i,1),q[i+3*m]=node(b,c,i,1);
sort(q+1,q+4*m+1,cmp);
for(l=1,r=0,i=1;i<=4*m;i++)
{
while(l>q[i].a) l--,s[v[l]]++,sum+=2*s[v[l]]-1;
while(l<q[i].a) sum-=2*s[v[l]]-1,s[v[l]]--,l++;
while(r<q[i].b) r++,s[v[r]]++,sum+=2*s[v[r]]-1;
while(r>q[i].b) sum-=2*s[v[r]]-1,s[v[r]]--,r--;
ans[q[i].org]+=q[i].k*sum;
}
for(i=1;i<=m;i++) printf("%lld\n",ans[i]>>1);
return 0;
}
【BZOJ5016】[Snoi2017]一个简单的询问 莫队的更多相关文章
- 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]一个简单的询问 莫队算法
题目描述 给你一个长度为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 ...
- BZOJ5016 Snoi2017一个简单的询问(莫队)
容易想到区间转化成前缀和.这样每个询问有了二维坐标,莫队即可. #include<iostream> #include<cstdio> #include<cmath> ...
- [bzoj5016][Snoi2017]一个简单的询问
来自FallDream的博客,未经允许,请勿转载,谢谢. 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中 ...
- [SNOI2017]一个简单的询问
[SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...
- [SNOI2017]一个简单的询问【莫队+容斥原理】
题目大意 给你一个数列,让你求两个区间内各个数出现次数的乘积的和. 分析 数据范围告诉我们可以用莫队过. 我并不知道什么曼哈顿什么乱七八糟的东西,但是我们可以用容斥原理将这个式子展开来. \[\sum ...
- bzoj 5016: [Snoi2017]一个简单的询问
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...
随机推荐
- Windows API常用函数
转自:http://www.cnblogs.com/xiashengwang/p/4026259.html .NET中虽然类库很强,但还是有些时候功能有限,掌握常用的api函数, 会给我们解决问题提供 ...
- ISP图像处理算法之---Demosaic
目前市场上主流传感器为Coms传感器,sensor出来的的数据格式为bayer数据格式,这种格式,每个像素点只有三个颜色通道中的一个,如图1所示 ...
- Redis源代码分析(十三)--- redis-benchmark性能測试
今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...
- Angular 学习笔记——run
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- IOS URL无法对加号进行编码导致http请求时服务器端获取的内容中加号变成空格问题
一.背景. 将以下地址请求服务器时,如果postUrl中某个参数值包含符号+ 那么在服务器获取到这个参数值时,其加号变成了一个空格. NSString *postUrl = "http地址 ...
- Android学习(五) 圆角实现(转)
设置边框圆角可以在drawable-mdpi目录里定义一个取名为corners_bg.xml <?xml version="1.0" encoding="utf-8 ...
- Oracle基础 索引
一.索引 索引是一种快速访问数据的途径,可提高数据库性能.索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据,就像书的目录,可以快速查找所需的信息,无须阅读整本书. (一)索引的分类 逻 ...
- springboot缓存及连接池配置
参见https://coding.imooc.com/lesson/117.html#mid=6412 1.springboot的springweb自己默认以及配置好了缓存,只需要在主文件(XxxAp ...
- 基于webmagic的种子网站爬取
代码地址如下:http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫.本文将介绍使用Spring/Myb ...
- 如何创建JAR文件?如何运行.jar形式的Java程序?
一.如何创建JAR文件? .jar是用来压缩档案或者解压档案的文件格式,其特点是具有无损压缩的功能.想知道如何创建这种程序?请访问 http://www.cnblogs.com/yjmyzz/p/ex ...