【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
题目描述

输入
输出
样例输入
5
1 1 1 1 1
2
1 2 3 4
1 1 4 4
样例输出
4
1
题解
莫队算法
(为了方便,以下使用$S_x(l,r)$代替$get(l,r,x)$)
题目一眼莫队,不过由于一个询问有4个参数,不能直接处理。
考虑将询问拆成前缀相减的形式,即:
$\ \ \ \ \sum\limits_xS_x(l_1,r_1)·S_x(l_2,r_2)\\=\sum\limits_{x}(S_x(1,r_1)-S_x(1,l_1-1))·(S_x(1,r_2)-S_x(1,l_2-1))\\=\sum\limits_{x}(S_x(1,r_1)·S_x(1,r_2)-S_x(1,l_1-1)·S_x(1,r_2)--S_x(1,r_1)·S_x(1,l_2-1)+S_x(1,l_1-1)·S_x(1,l_2-1))\\=Q(r_1,r_2)-Q(l_1-1,r_2)-Q(r_1,l_2-1)+Q(l_1-1,l_2-1)$
其中:
$Q(a,b)=\sum\limits_{x}S_x(1,a)·S_x(1,b)$
于是就可以把每个询问拆成4个,使用莫队算法分别计算对每个答案的贡献即可。
注意当$a$或$b$中某一个为0时的情况需要过滤掉,否则会加入不存在的位置导致挂掉。
时间复杂度$O(n\sqrt{4m})$
#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 50010
using namespace std;
typedef long long ll;
int si , v[N] , cl[N] , cr[N] , tot;
ll ans[N];
struct data
{
int l , r , flag , id;
data() {}
data(int a , int b , int c , int d) {l = min(a , b) , r = max(a , b) , flag = c , id = d;}
bool operator<(const data &a)const {return (l - 1) / si == (a.l - 1) / si ? r < a.r : (l - 1) / si < (a.l - 1) / si;}
}a[N << 2];
int main()
{
int n , m , i , x1 , y1 , x2 , y2 , lp = 0 , rp = 0;
ll now = 0;
scanf("%d" , &n) , si = (int)sqrt(n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);
scanf("%d" , &m);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &x1 , &y1 , &x2 , &y2) , a[++tot] = data(y1 , y2 , 1 , i);
if(x1 > 1) a[++tot] = data(x1 - 1 , y2 , -1 , i);
if(x2 > 1) a[++tot] = data(y1 , x2 - 1 , -1 , i);
if(x1 > 1 && x2 > 1) a[++tot] = data(x1 - 1 , x2 - 1 , 1 , i);
}
sort(a + 1 , a + tot + 1);
for(i = 1 ; i <= tot ; i ++ )
{
while(lp < a[i].l) lp ++ , now += cr[v[lp]] , cl[v[lp]] ++ ;
while(rp < a[i].r) rp ++ , now += cl[v[rp]] , cr[v[rp]] ++ ;
while(lp > a[i].l) cl[v[lp]] -- , now -= cr[v[lp]] , lp -- ;
while(rp > a[i].r) cr[v[rp]] -- , now -= cl[v[rp]] , rp -- ;
ans[a[i].id] += a[i].flag * now;
}
for(i = 1 ; i <= m ; i ++ ) printf("%lld\n" , ans[i]);
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]一个简单的询问 莫队
[BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...
- 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) ...
- bzoj 5016: [Snoi2017]一个简单的询问
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...
- 【bzoj3781】小B的询问 莫队算法
原文地址:http://www.cnblogs.com/GXZlegend/p/6803821.html 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L ...
随机推荐
- win10 安装oracle 11gR2_database出现universal Installer后闪退就没反应的解决方案
前言:本机为 win 10 64位系统,安装oracle win64_11gR2_database的时候出现问题,安装不了,经排查解决了此问题.转载请注明出处:https://www.cnblogs. ...
- 阿里云服务器被他人通过SSH暴力破解后的安全加固
背景说明:我登录阿里云服务器控制台时,收到几条安全警告信息. 从图中可以知道,对方的IP地址是47.97.68.118,通过SSH登录方式,登录时用我服务器里的admin用户,然后用穷举法暴力破解ad ...
- jQuery导入及测试
jQuery导入: <script type="text/javascript" src="js/jquery-3.1.1.min.js">< ...
- python中垃圾回收机制
Python垃圾回收机制详解 一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...
- Android 使用全局变量的问题
现在每天都在忙,而且一忙起来,就把写笔记的事情放在了后面,最近在写程序的时候,突然要使用全局变量,就按照以前的方式,写了一个类,然后把变量都声明为静态变量,然后做为全局变量使用,但是在进行Activi ...
- ios虚拟机安装 (三)
安装mac系统出现欢迎使用的界面-->一直继续(个人设定) 点击左上角-->Dock-->启动放大 Safari 浏览器
- BASE_DIR 拼接文件路径
# C:/Disk_D/pycharm_stu/macboy/blog/views/tt.py 当前文件绝对路径 BASE_DIR = os.path.dirname(os.path.dirname( ...
- python学习手册中的一些易忘的点(前三部分)
1.ubuntu下让python脚本可直接运行: test.py文件(后缀可省)#!/usr/bin/pythonprint('wwwww') sudo chmod +x ./test.py (sud ...
- springboot学习入门之五---开发Web应用之JSP篇
转载:http://tengj.top/2017/03/13/springboot5/ 1整体结构 整体的框架结构,跟前面介绍Thymeleaf的时候差不多,只是多了webapp这个用来存放jsp的目 ...
- 使用ASP.Net WebAPI构建REST服务——客户端
原文的链接:http://www.cnblogs.com/TianFang/p/3724449.html WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时 ...