THUWC 考了莫队(这个应该可以说吧)

然而不会莫队,签到失败,所以找到了一道长得差不多的题写一写

为什么这么长时间都没有发现这道题(半恼

给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出
 
get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次。
 
 
 
sol:
 
把一个询问拆成 4 个前缀询问,注意到 $\sum\limits_{x=0}^{\infty}get(l_1,r_1,x) \cdot get(l_2,r_2,x) = \sum\limits_{x=0}^{\infty}get(1,r_1,x) \cdot get(1,r_2,x) - \sum\limits_{x=0}^{\infty}get(1,l_1-1,x) \cdot get(1,r_2,x) - \sum\limits_{x=0}^{\infty}get(1,r_1,x) \cdot get(1,r_2 - 1,x) + \sum\limits_{x=0}^{\infty}get(1,l_1-1,x) \cdot get(1,l_2-1,x)$
然后每组询问就是一个二元组了(因为左端点都是 $1$) ,所以可以莫队,用两个 $cnt$ 数组记一下左边右边的每一个 $x$ 出现了多少次即可
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-') f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,a[maxn];
int bl[maxn],tot,cntl[maxn],cntr[maxn];
LL ans[maxn];
struct Ques
{
int l,r,flag,pos;
Ques(){}
Ques(int _1,int _2,int _3,int _4): l(_1),r(_2),flag(_3),pos(_4){}
bool operator < (const Ques &b)const{return (bl[l] == bl[b.l]) ? (r < b.r) : (bl[l] < bl[b.l]);}
}qs[maxn << ];
int main()
{
n = read();
for(int i=;i<=n;i++)a[i] = read();
int BLSIZE = sqrt(n);
for(int i=;i<=n;i++)bl[i] = i / BLSIZE;
int q = read();
for(int i=;i<=q;i++)
{
int xl = read(),xr = read(),yl = read(),yr = read();
qs[++tot] = Ques(xr,yr,,i);
if(xl > )qs[++tot] = Ques(xl - ,yr,-,i);
if(yl > )qs[++tot] = Ques(xr,yl - ,-,i);
if(xl > && xr > )qs[++tot] = Ques(xl - ,yl - ,,i);
}
sort(qs + ,qs + tot + );
int l = ,r = ;
LL now = ;
for(int i=;i<=tot;i++)
{
while(l < qs[i].l){l++;now += cntr[a[l]];cntl[a[l]]++;}
while(r < qs[i].r){r++;now += cntl[a[r]];cntr[a[r]]++;}
while(l > qs[i].l){cntl[a[l]]--;now -= cntr[a[l]];l--;}
while(r > qs[i].r){cntr[a[r]]--;now -= cntl[a[r]];r--;}
ans[qs[i].pos] += qs[i].flag * now;
}
for(int i=;i<=q;i++)cout << ans[i] << endl;
}

bzoj 5016 一个简单的询问的更多相关文章

  1. [SNOI2017]一个简单的询问

    [SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...

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

    #2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...

  3. 【BZOJ5016】[Snoi2017]一个简单的询问 莫队

    [BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...

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

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

  5. bzoj P5016[Snoi2017]一个简单的询问——solution

    Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出   get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input ...

  6. bzoj 5016: [Snoi2017]一个简单的询问

    Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...

  7. Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥

    传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...

  8. bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...

  9. [bzoj5016][Snoi2017]一个简单的询问

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出   get(l,r,x)表示计算区间[l,r]中 ...

随机推荐

  1. MySQL数据库(1)_MySQL数据库介绍与安装

    一.数据库相关概念的简介 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展 ...

  2. 小数据池、is 和 ==的区别

    小数据池,在一定情况下出现内存共享(只有int  和 str 才有的)   is 和 ==的区别 id()     打印数据的地址 a  = 'hello' b = 'hello' print(a = ...

  3. Eclipse运行错误:Failed to load the JNI shared library的解决办法

    出现上述错误的原因是环境变量配置出问题,查看JAVA_HOME这一环境变量的值是否正确. 操作步骤如下, 1.右键“我的电脑”->属性 ↓ 2.打开“高级系统设置”,如下图: ↓ 3.选择“环境 ...

  4. TOGAF和BABOK

  5. Android开发BUG及解决方法2

    错误描述: 错误分析: 程序依赖的两个包冲突 解决方法: 在build.gradle文件中android节点下加packagingOptions节点

  6. OpenCV图片拼接的两种方法

    https://my.oschina.net/xiaot99/blog/226589 一.原图 1.jpg                                        2.jpg   ...

  7. 【FAQ系列】Relay log 导致复制启动失败

    今天在使用冷备份文件重做从库时遇到一个报错,值得研究一下. 版本:MySQL5.6.27 一.报错现象 dba:(none)> start slave; ERROR (HY000): Slave ...

  8. 快乐学习 Ionic Framework+PhoneGap 手册1-3 {面板切换}

    编程的快乐和乐趣,来自于能成功运行程序并运用到项目中,会在后面案例,实际运用到项目当中与数据更新一起说明 从面板切换开始,请看效果图和代码,这只是一个面板切换的效果 Index HTML Code & ...

  9. mongoDB中批量修改字段

    // 为每一个文章文档新增一个image_count字段,用于记录此文章包含的图片个数 db['test.articles'].find({'title':'wfc test'}).forEach( ...

  10. 解决MySQL因不能创建 PID 导致无法启动的方法

    问题描述 MySQL 启动报错信息如下: ? 1 2 Starting mysqld (via systemctl):  Job for mysqld.service failed because t ...