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. 0607am抽象类&接口&析构方法&tostring&小知识点

    /*class ren{ public static $color;//静态 static function () { ren::$color; self::$color;//self只能写在类里面, ...

  2. Vimium~让您的Chrome起飞

    工欲善其事,必先利其器!撸起Vimium,我的Chrome就这么起飞了. 学起(了解几个快捷键即可)And撸起Vimium,想黑客一般在Chrome上飞起.Vimium常用快捷键(注:区分大小写)j, ...

  3. Loadrunder脚本篇——webservice接口测试(一)

    函数介绍 soap_request 函数执行一个SOAP请求 函数原型 int soap_request( const char *StepName, ExpectedResponse, URL, , ...

  4. $ 用python处理Excel文档(1)——用xlrd模块读取xls/xlsx文档

    本文主要介绍xlrd模块读取Excel文档的基本用法,并以一个GDP数据的文档为例来进行操作. 1. 准备工作: 1. 安装xlrd:pip install xlrd 2. 准备数据集:从网上找到的1 ...

  5. Springboot文件下载

    https://blog.csdn.net/stubbornness1219/article/details/72356632 Springboot对资源的描述提供了相应的接口,其主要实现类有Clas ...

  6. 【leetcode刷题笔记】Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  7. Docker 三剑客

    Docker三剑客: Docker-Machine Docker Machine is a tool that lets you install Docker Engine on virtual ho ...

  8. 用vim写python脚本的自动缩进格式设置

  9. HBase-存储-概览

    概览 HBase主要处理两种文件:一种是预写日志(Write-Ahead Log,WAL),另一种是实际的数据文件.这两种文件主要由HRegionServer管理.在某些情况下,HMaster也可以进 ...

  10. HBase-修改表结构

    HBase修改表结构 package com.hbase.HBaseAdmin; import java.io.IOException; import org.apache.hadoop.conf.C ...