【 Gym - 101138D 】Strange Queries (莫队算法)

时间:2023-02-23 08:42:37

BUPT2017 wintertraining(15) #4B

Gym - 101138D

题意

a数组大小为n。(1 ≤ n ≤ 50 000) (1 ≤ q ≤ 50 000)(1 ≤ ai ≤ n)

q个查询,询问两个区间相同的数有多少对。

题解

[sl,sr]和[tl,tr]区间相同的数的对数可以用\(f[sl,tr]-f[sl,tl]-f[sr,tr]+f[sr,tr]\)计算。\(f[l,r]\)为区间[l,r]内相同的数的对数。

对于每个询问,记录需要计算的f的区间,然后按l/sqrt(n)为第一关键字,r为第二关键字排序。

如果计算完f[l,r],那么计算f[l1,r1]时,可以由[l,r]区间转移到[l1,r1]区间,相当于移动左右端点的指针。

随便写写的时间复杂度分析(n为计算的区间个数):

pos[i]记录区间i的第一关键字。

相邻的两个计算区间(排序后),若pos相同,左指针移动最远\(\sqrt n\)步,最坏情况就是n个区间都移动这么多步,总的最多\(n\sqrt n\)步。

若pos不同,总的最多是\(n\)步。

pos相同的所有区间,右指针最多共移动n步(1到n),共\(\sqrt n\)个pos值,总的最多移动\(n\sqrt n\)步。

pos不同时,右指针最多移动n步(n到1),共\(\sqrt n\)个pos,总的最多移动\(n\sqrt n\)步。

因为计算所有区间的过程,左指针最多移动\(n\sqrt n\)步,右指针最多移动了\(n\sqrt n\)步。因此复杂度是\(O(n\sqrt n)\)。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#define N 50005
#define ll long long
using namespace std;
int n,m,a[N],qs,pos[N];
ll ans[N],s[N];
struct node{int l,r,d;}p[N<<2];
bool cmp(node a,node b){
return pos[a.l]<pos[b.l]||pos[a.l]==pos[b.l]&&a.r<b.r;
}
void add(int p,ll &f){
f+=s[a[p]]++;
}
void sub(int p,ll &f){
f-=--s[a[p]];
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1,j=1;i<=n;i++){
if(i%(int)sqrt(n)==0)j++;
pos[i]=j;
}
scanf("%d",&qs);
for(int i=1;i<=qs;i++){
int sl,sr,tl,tr;
scanf("%d%d%d%d",&sl,&sr,&tl,&tr);
sr++;tl--;
//[sl,tr]-[sl,tl-1]-[sr+1,tr]+[sr+1,tl-1]
p[m++]=(node){sl,tr,i};p[m++]=(node){sl,tl,-i};
p[m++]=(node){sr,tr,-i};p[m++]=(node){sr,tl,i};
}
sort(p,p+m,cmp);
int L=n+1,R=n;
ll num=0;
for(int i=0;i<m;i++){
while(L<p[i].l)
sub(L++,num);
while(L>p[i].l)
add(--L,num);
while(R>p[i].r)
sub(R--,num);
while(R<p[i].r)
add(++R,num);
if(p[i].d>0)ans[p[i].d]+=num;
else ans[-p[i].d]-=num;
}
for(int i=1;i<=qs;i++)printf("%lld\n",ans[i]);
return 0;
}

【 Gym - 101138D 】Strange Queries (莫队算法)的更多相关文章

  1. &lbrack;Codeforces375D&rsqb;Tree and Queries&lpar;莫队算法&rpar;

    题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...

  2. CFGym101138D Strange Queries 莫队&sol;分块

    正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...

  3. 莫队算法 Gym - 100496D Data Mining

    题目传送门 /* 题意:从i开始,之前出现过的就是之前的值,否则递增,问第p个数字是多少 莫队算法:先把a[i+p-1]等效到最前方没有它的a[j],问题转变为求[l, r]上不重复数字有几个,裸莫队 ...

  4. Codeforces617 E &period; XOR and Favorite Number&lpar;莫队算法&rpar;

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  5. HDU 4358 莫队算法&plus;dfs序&plus;离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)T ...

  6. Codeforces Round &num;340 &lpar;Div&period; 2&rpar; E&period; XOR and Favorite Number 莫队算法

    E. XOR and Favorite Number 题目连接: http://www.codeforces.com/contest/617/problem/E Descriptionww.co Bo ...

  7. XOR and Favorite Number(莫队算法&plus;分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  8. Codeforces Round &num;340 &lpar;Div&period; 2&rpar; E&period; XOR and Favorite Number 【莫队算法 &plus; 异或和前缀和的巧妙】

    任意门:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...

  9. D&period; Powerful array 离线&plus;莫队算法 给定n个数,m次查询;每次查询&lbrack;l&comma;r&rsqb;的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt&ast;cnt&ast;x&semi; 所有贡献和即为该区间的值;

    D. Powerful array time limit per test seconds memory limit per test megabytes input standard input o ...

  10. 莫队算法初识~~CodeForces - 617E

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

随机推荐

  1. 彻底解决phpcms v9升级后&comma;文章发布出现: Mysql 1267错误:MySQL Error &colon; Illegal mix of collations 解决办法

    彻底解决phpcms v9升级后,文章发布出现: MySQL Query : SELECT * FROM `withli_a`.`v9_keyword` WHERE `keyword` = '吼吼' ...

  2. IntelliJ IDEA 开发前的设置

    1.IntelliJ IDEA 显示行号方法 设置方法:File->Settings->Editor->General->Appearance->Show line nu ...

  3. HackerRank &quot&semi;Minimum Average Waiting Time&quot&semi; &excl;

    Something to learn: http://blog.csdn.net/yuwenshi/article/details/36666453 Shortest Job First Algori ...

  4. &period;net4&period;0注册到IIS

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...

  5. 关于 JavaScript 中一个小细节问题 (在控制台中直接 &lbrace;Name&colon;&&num;39&semi;王尼玛&&num;39&semi;&comma;Age&colon;20&rcub; 对象报错问题)

    在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚 ...

  6. 招商银行支付dll在64位windows系统下的注册使用问题

    按照文档中的说明,注册完dll后,依然报找不到COM组件的错误.尝试过以下方法: 1.在VS中将项目编译目标改为x86,只能解决VS可以启动程序的问题,一部署到IIS中就出错. 2.估计是因为权限问题 ...

  7. 如何安装并使用bower包依赖工具

    什么是bower Bower是一个客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源.其他一些建立在Bower基础之上的开发工具,如YeoMan和 ...

  8. 从零开始--Spring项目整合&lpar;2&rpar;整合SpringMVC

    1.pom.xml 定义版本 <properties> <spring.version>4.2.7.RELEASE</spring.version> <jac ...

  9. SQL Server 插入含有中文字符串出现乱码现象的解决办法

    ELECT  COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')       --查询SQLServer编码格式的语句 下面 ...

  10. Photoshop CS6 操作记录

    全局快捷键 橡皮 E 画笔 B 魔棒工具 W 钢笔工具 P 选区工具 M 移动画布 按住Space后鼠标拖动 放大缩小画布 Ctrl+-, Ctrl++ 调出/收回标尺 Ctrl+R 调整画笔大小 [ ...