BZOJ5016:[SNOI2017]一个简单的询问(莫队)
Description

Input
Output
Sample Input
1 1 1 1 1
2
1 2 3 4
1 1 4 4
Sample Output
1
Solution
懒得写一遍公式了直接放大爷的题解吧……
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N (500009)
#define LL long long
#define MOD (1000000007)
using namespace std; struct Node{int l,r,id,opt; LL ans;}Q[N*];
int n,a[N],m,c1[N],c2[N],ID[N],q_num;
LL ans,S[N]; inline int read()
{
int x=,w=; char c=getchar();
while (c<'' || c>'') {if (c=='-') w=-; c=getchar();}
while (c>='' && c<='') x=x*+c-'', c=getchar();
return x*w;
} void Ins(int opt,int p)
{
ans-=1ll*c1[a[p]]*c2[a[p]];
if (opt==) ++c1[a[p]];
else ++c2[a[p]];
ans+=1ll*c1[a[p]]*c2[a[p]];
} void Del(int opt,int p)
{
ans-=1ll*c1[a[p]]*c2[a[p]];
if (opt==) --c1[a[p]];
else --c2[a[p]];
ans+=1ll*c1[a[p]]*c2[a[p]];
} bool cmp(Node a,Node b)
{
if (ID[a.l]==ID[b.l]) return a.r<b.r;
return ID[a.l]<ID[b.l];
} int main()
{
n=read(); int unit1=sqrt(n);
for (int i=; i<=n; ++i) a[i]=read(),ID[i]=i/unit1;
m=read();
for (int i=; i<=m; ++i)
{
int l1=read(),r1=read(),l2=read(),r2=read();
Q[++q_num]=(Node){r1,r2,i,};
Q[++q_num]=(Node){l1-,r2,i,-};
Q[++q_num]=(Node){r1,l2-,i,-};
Q[++q_num]=(Node){l1-,l2-,i,};
}
sort(Q+,Q+*m+,cmp);
int l=,r=;
for (int i=; i<=*m; ++i)
{
while (l<Q[i].l) Ins(,++l);
while (l>Q[i].l) Del(,l--);
while (r<Q[i].r) Ins(,++r);
while (r>Q[i].r) Del(,r--);
Q[i].ans=ans;
}
for (int i=; i<=*m; ++i)
S[Q[i].id]+=Q[i].ans*Q[i].opt;
for (int i=; i<=m; ++i) printf("%lld\n",S[i]);
}
BZOJ5016:[SNOI2017]一个简单的询问(莫队)的更多相关文章
- Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥
传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...
- 【BZOJ5016】[Snoi2017]一个简单的询问 莫队
[BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...
- 【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 第 ...
随机推荐
- 数据结构与算法--最小生成树之Kruskal算法
数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...
- 放苹果(poj1664递归)
ti放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24392 Accepted: 15513 Descripti ...
- HDU1824(2-SAT)
Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 关于JavaScript原型对象那些事儿
①为什么要使用原型:为了实现继承. ②利用constructor属性可以让实例化对象轻松访问原型,实现实例化对象对原型对象的修改,但是原型对象是全局对象,一般不能随意修改原型对象的成员.该属性多用于调 ...
- BZOJ2957: 楼房重建(分块)
题意 题目链接 Sol 自己YY出了一个\(n \sqrt{n} \log n\)的辣鸡做法没想到还能过.. 可以直接对序列分块,我们记第\(i\)个位置的值为\(a[i] = \frac{H_i}{ ...
- js 动态声明变量
var object = {}; for(var i=0; i<5; i++){ object['attr'+i] = i; }
- H5 canvas 实现飞机大战游戏
首先看几张效果图: 上面三张图分别对应游戏的三种状态 ready,play,pause.体验一下 先介绍一下canvas 画图的原理,在这个游戏中的背景,飞机,子弹以及飞机被击中爆炸的效果都是一张张的 ...
- Android 优秀开源项目
以下是本人日常工作中收集的比较不错的Android开源项目 roottools: RootTools gives Rooted developers easy access to common roo ...
- servlet3.0 web.xml 标头
<?xml version="1.1" encoding="UTF-8"?> <web-app xmlns="http://java ...
- Python图像识别(聚类)
# -*- coding: utf-8 -*- """ Created on Fri Sep 21 15:37:26 2018 @author: zhen "& ...