bzoj5016 一个简单的询问
这种不可直接做的问题
数据范围又很小
考虑莫队
但是,l1,l2,r1,r2四维?
考虑把询问二维差分!
f(a,b)表示,询问[1,a],[1, b]的答案
所以,ans(l1,r1,l2,y2)=f(r1,r2)-f(l1-1,r2)-f(r1,l2-1)+f(l1-1,l2-1)
正确性的话,考虑每一个种类k被统计的情况,c*d=(a+b)*(c+d)-a*(c+d)-c*(a+b)+a*b
需要离散化
数组开4倍
#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,m;
int a[N];
int blo[N];
int b[N];
ll ans[N];
struct que{
int l,r;
int c,id;
que(){}
que(int ll,int rr,int cc,int dd){
if(ll>rr) swap(ll,rr);
l=ll;r=rr;c=cc;id=dd;
}
bool friend operator <(que a,que b){
if(blo[a.l]==blo[b.l]){
if(blo[a.l]&) return a.r<b.r;
return a.r>b.r;
}
return blo[a.l]<blo[b.l];
}
}q[*N];
int tot;
int buc[][N];
ll now;
int l,r;
void dele(int d,int c){
now-=buc[d^][c];
buc[d][c]--;
}
void add(int d,int c){
now+=buc[d^][c];
buc[d][c]++;
}
void modui(){
l=;r=;now=;
for(reg i=;i<=tot;++i){
while(l<q[i].l) ++l,add(,a[l]);
while(l>q[i].l) dele(,a[l]),--l;
while(r<q[i].r) ++r,add(,a[r]);
while(r>q[i].r) dele(,a[r]),--r;
ans[q[i].id]+=(ll)now*q[i].c;
}
}
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(a[i]);
blo[i]=(i-)/+;
b[i]=a[i];
}
sort(b+,b+n+);
int cnt=unique(b+,b+n+)-b-;
for(reg i=;i<=n;++i){
a[i]=lower_bound(b+,b+cnt+,a[i])-b;
//cout<<" a[i] "<<a[i]<<endl;
}
rd(m);
int l1,l2,r1,r2;
for(reg i=;i<=m;++i){
rd(l1);rd(r1);rd(l2);rd(r2);
if(l1>&&l2>) q[++tot]=que(l1-,l2-,,i);
if(l1>) q[++tot]=que(l1-,r2,-,i);
if(l2>) q[++tot]=que(r1,l2-,-,i);
q[++tot]=que(r1,r2,,i);
}
sort(q+,q+tot+);
modui();
for(reg i=;i<=m;++i){
printf("%lld\n",ans[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/27 22:24:01
*/
询问的二维拆分有点意思!
以前并没有遇到这种问题(最多就是一维差分)
之前莫队都是(l,r)这种
如果可以前缀差分的话,那么多个(li,ri)都是可以的
本质就是容斥,或者高维差分
bzoj5016 一个简单的询问的更多相关文章
- 【BZOJ5016】[Snoi2017]一个简单的询问 莫队
[BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...
- [SNOI2017]一个简单的询问
[SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...
- loj #2254. 「SNOI2017」一个简单的询问
#2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_iai,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...
- 「SNOI2017」一个简单的询问
「SNOI2017」一个简单的询问 简单的解法 显然可以差分一下. \[get(l,r,x)\times get(l1,r1,x)=get(1,r,x) \times get(1,r1,x)-get( ...
- bzoj P5016[Snoi2017]一个简单的询问——solution
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]中 ...
- 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,表 ...
随机推荐
- Django中的Project和App的区别
Django是一个非常流行的用python编写的Web框架,在使用Django之前,我们需要了解一些基本的概念,这样可以在使用Django的时候对其有一个更加深入的把握.本文主要介绍Django中两个 ...
- CentOS 6.7 安装配置 nagios
一.简介 Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警,第一时间 ...
- 自定义UIView怎么注册销毁NSNotification通知
问题描述:在使用天猫tangram框架后.部分组件自定义后会用到通知,但是在iOS 8 系统中,会崩溃? 原因分析:当对象挂掉后,要对应移除注册的通知. 否则当你重复执行发送通知的时候,在iOS8 系 ...
- Beta发布--PSP DAILY软件功能说明书2.0
一.开发背景 你在完成了一周的软件工程作业后,需要提交一个PSP图表,里面有4项,如下所示: 1.本周PSP表格,包含每项任务的开始.中断.结束.最终时间,格式如下: 2.本周进度条,包含从开始到现在 ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- 20162328蔡文琛 week10 大二
20162328 2017-2018-1 <程序设计与数据结构>第十周学习总结 教材学习内容总结 理解图与有向图.无向图 理解带权图 会应用带权图 理解图的广度优先遍历和深度优先遍历 掌握 ...
- An internal error occurred during: "Launching MVC on Tomcat 7.x".
删除工作空间下的“/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.genuitec.eclipse.ast.deploy.core ...
- Firefox插件开发学习总结
2018.06.14 我们小组最初只准备开发运行在google上的知乎插件,但我们经过调研发现还有一大部分用户是使用的火狐浏览器,所以我们也准备制作火狐插件.以下是我学习了部分火狐插件制作知识后的总结 ...
- Gradle入门(1):安装
在Ubuntu下,执行以下命令: sudo apt-get install gradle 安装完成后,执行命令: gradle -v 得到以下信息: Picked up _JAVA_OPTIONS: ...
- ADO.NET使用using关闭数据库连接
using (SqlConnection conn = new SqlConnection(source)) { // open the connoction conn.Open(); // Do s ...