#2254. 「SNOI2017」一个简单的询问

题目描述

给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1,r1,l2,r2l_1,r_1,l_2,r_2l​1​​,r​1​​,l​2​​,r​2​​,需输出

∑x=0∞get(l1,r1,x)⋅get(l2,r2,x) \sum\limits_{x=0}^\infty \text{get}(l_1,r_1,x)\cdot \text{get}(l_2,r_2,x)​x=0​∑​∞​​get(l​1​​,r​1​​,x)⋅get(l​2​​,r​2​​,x)

get(l,r,x) \text{get}(l,r,x)get(l,r,x) 表示计算区间 [l,r][l,r][l,r] 中,数字 xxx 出现了多少次。

输入格式

第一行,一个数字 NNN,表示序列长度。
第二行,NNN 个数字,表示 a1∼aNa_1\sim a_Na​1​​∼a​N​​。
第三行,一个数字 QQQ,表示询问个数。
第 4∼Q+34\sim Q+34∼Q+3 行,每行四个数字 l1,r1,l2,r2l_1,r_1,l_2,r_2l​1​​,r​1​​,l​2​​,r​2​​,表示询问。

输出格式

对于每组询问,输出一行一个数字,表示答案。

样例

样例输入

5
1 1 1 1 1
2
1 2 3 4
1 1 4 4

样例输出

4
1

数据范围与提示

对于 20%20\%20% 的数据,1≤N,Q≤10001\leq N,Q\leq 10001≤N,Q≤1000;
对于另外 30%30\%30% 的数据,1≤ai≤501\leq a_i\leq 501≤a​i​​≤50;
对于 100%100\%100% 的数据,N,Q≤50000N,Q\leq 50000N,Q≤50000,1≤ai≤N1\leq a_i\leq N1≤a​i​​≤N,1≤l1≤r1≤N1\leq l_1\leq r_1\leq N1≤l​1​​≤r​1​​≤N,1≤l2≤r2≤N1\leq l_2\leq r_2\leq N1≤l​2​​≤r​2​​≤N。

数据范围与原题相同,但测试数据由本站会员自制,并非原数据。
时限已按照评测机速度调整,原题时限为 2000 ms,省选评测时调整为 4000 ms,这里按 4000 ms 调整。

注意:答案有可能超过 int 的最大值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50010
using namespace std;
int n,a[maxn],b[maxn],l1,r1,l2,r2,mx,cnt[maxn][],num;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) {
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b+n+);
num=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+num+,a[i])-b;
int T;scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
memset(cnt,,sizeof(cnt));
for(int i=l1;i<=r1;i++)cnt[a[i]][]++;
for(int i=l2;i<=r2;i++)cnt[a[i]][]++;
long long ans=;
for(int i=;i<=num;i++)ans+=1LL*cnt[i][]*cnt[i][];
cout<<ans<<endl;
}
return ;
}

80分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 50010
using namespace std;
int n,block[maxn],sz,a[maxn],num1[maxn],num2[maxn],m,tot,L,R;
long long res=,Ans[maxn];
struct node{
int l,r,id,ad;
bool operator < (const node &b)const{
if(block[l]==block[b.l])return r<b.r;
return l<b.l;
}
}q[maxn*];
int main(){
scanf("%d",&n);sz=sqrt(n);
for(int i=;i<=n;i++)block[i]=(i-)/sz+;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);
int l1,l2,r1,r2;
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
q[++tot]=(node){r1,r2,i,};
q[++tot]=(node){r1,l2-,i,-};
q[++tot]=(node){l1-,r2,i,-};
q[++tot]=(node){l1-,l2-,i,};
}
sort(q+,q+tot+);
for(int i=;i<=tot;i++){
while(L<q[i].l)L++,res+=num2[a[L]],++num1[a[L]];
while(L>q[i].l)res-=num2[a[L]],--num1[a[L]],--L;
while(R<q[i].r)++R,res+=num1[a[R]],++num2[a[R]];
while(R>q[i].r)res-=num1[a[R]],--num2[a[R]],--R;
Ans[q[i].id]+=q[i].ad*res;
}
for(int i=;i<=m;i++)cout<<Ans[i]<<endl;
return ;
}

100分 莫队

loj #2254. 「SNOI2017」一个简单的询问的更多相关文章

  1. 「SNOI2017」一个简单的询问

    「SNOI2017」一个简单的询问 简单的解法 显然可以差分一下. \[get(l,r,x)\times get(l1,r1,x)=get(1,r,x) \times get(1,r1,x)-get( ...

  2. loj2254 「SNOI2017」一个简单的询问

    ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...

  3. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  4. loj #2255. 「SNOI2017」炸弹

    #2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...

  5. LOJ——#2256. 「SNOI2017」英雄联盟

    https://loj.ac/problem/2256 题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强 ...

  6. Loj #2256. 「SNOI2017」英雄联盟

    题目 我就是个丝薄 如果要用\(dp_i\)表示凑出\(i\)的最小花费显然不可能的 之后大力猜想能凑出来的状态不会很多,我的暴力也告诉我不是很多,好像也确实不多的样子,大概\(4e4\)左右 但是我 ...

  7. Loj #3057. 「HNOI2019」校园旅行

    Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...

  8. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  9. Loj #2719. 「NOI2018」冒泡排序

    Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排 ...

随机推荐

  1. websocket之三:Tomcat的WebSocket实现

    Tomcat自7.0.5版本开始支持WebSocket,并且实现了Java WebSocket规范(JSR356 ),而在7.0.5版本之前(7.0.2版本之后)则采用自定义API,即WebSocke ...

  2. HashSet中是如何判断元素是否重复的

    HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素: 如果已存在则调用Obje ...

  3. hibernate Annotation 以及注解版的数据关联

    目的是不写xxx.hbm.xml映射文件,使用注解 主配置文件还是要有hibernate.cfg.xml <?xml version="1.0" encoding=" ...

  4. sql server小知识

    SELECT TOP 10000 * FROM [LogFeedback].[dbo].[ahwater_perf_monitor] order by timestramp desc   降序 asc ...

  5. hive与hbase整合方式和优劣

    分别安装hive 和 hbase 1.在hive中创建与hbase关联的表 create table ganji_ranks (row string,num string) STORED BY 'or ...

  6. poj1753-Flip Game 【状态压缩+bfs】

    http://poj.org/problem?id=1753 Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  7. php apc 安装

    APC简介 APC(Alternative PHP Cache)是一个PHP缓存.它在内存中存储PHP页面并且减少了硬盘的I/O.这对于性能的提升十分明显.你甚至可以在CPU使用率下降50%的情况下提 ...

  8. 【总结整理】JS的继承

    参考阮一峰的文章:http://javascript.ruanyifeng.com/oop/inheritance.html#toc4 function Shape() { this.x = 0; t ...

  9. Angular01 利用grunt搭建自动web前端开发环境、利用angular-cli搭建web前端项目

    搭建angular开发环境 一.下载并安装node 官网地址:点击前往 二.利用npm安装cnpm 安装好node后就可以使用npm命令啦 查看版本:npm -v 安装cnpm:npm install ...

  10. Switch/Case 的穿透性

    /*键盘录入1到12 ,对应输出该月份对应的季节 .如果输入的不是1到12,输出提示信息:您输入的数据有误. PS: 春季:3,4,5月份 夏季: 6,7,8月份 秋季: 9,10,11月份 冬季:1 ...