#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. DBUtils使用BeanListHandler及BeanHandler时返回null

    一.使用Bean相关方法时返回null 问题描述: 使用DBUtils查询数据,如果使用ArrayListHandler等都能够返回正确值,但使用BeanListHandler 和 BeanHandl ...

  2. 创建,查看,删除pool,查看,修改pool参数命令总结

    标签(空格分隔): ceph,ceph运维,pool 1. 创建pool命令: ceph的pool有两种类型,一种是副本池,一种是ec池,创建时也有所区别 1.1 创建副本池: $ sudo ceph ...

  3. MySQL mysqldump与innobackupex 组合备份

    此脚本,在01点进行一次逻辑全备份,03点进行一次物理全备份,中午12点进行一次增量物理备份 #! /bin/bash #05 01,03,12 * * * mysql /data/mysqldata ...

  4. Python Django框架 补充

    Django REST framework ORM框架整理 Django框架 app间互借models字段的操作 ORM数据库操作补充:models中的一对一操作.过滤.事务 Django model ...

  5. Drools学习笔记4—Consequence/RHS

    Right Hand Side,当LHS所有条件满足才会执行 可以使用LHS部分定义的绑定变量.全局变量.或者直接编写JAVA代码. 提供宏函数操作working memory fact对象,如ins ...

  6. ABP系统设置

    代码分析 在abp中添加系统设置,都是在模块的预初始化方法中添加的. Configuration.Settings.Providers.Add<EmailSettingProvider>( ...

  7. leetcode424

    public class Solution { public int CharacterReplacement(string s, int k) { int len = s.Length; ]; , ...

  8. 【WebRTC】术语

    WebRTC,名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  9. VS2010 rdlc报表无法显示“数据源”选项

  10. 使用广播退出打开了多个activity的程序

    新建一个父类,在父类里动态注册广播,在这个广播的onrecive方法中结束当前activity,让每个activity继承这个父类,在要关闭的activity中发送广播,搞定 下面是代码 父类 pro ...