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. [Codeforces375D]Tree and Queries(莫队算法)

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

  2. CFGym101138D Strange Queries 莫队/分块

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

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

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

  4. Codeforces617 E . XOR and Favorite Number(莫队算法)

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

  5. HDU 4358 莫队算法+dfs序+离散化

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

  6. Codeforces Round #340 (Div. 2) E. 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(莫队算法+分块)

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

  8. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫队算法 + 异或和前缀和的巧妙】

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

  9. D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

    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. 04-MirrorGate安装脚本备注

    1.run.sh #!/usr/bin/env bash set -e #当收到EXIT信号时执行这条命令,需要提前安装好docker-compose docker 并启动docker. trap ' ...

  2. Codeforces Hello 2019

    Hello 2019 手速场qwq 反正EGH太神仙了啊.jpg 考试的时候不会啊.jpg A 暴力.jpg #include <cstdio> #include <algorith ...

  3. PMS-授权中心

    概述 授权中心用基于角色的访问控制思想(RBAC-Role Based Access Control)来实现各个业务系统的功能权限及数据权限控制.功能权限是指能否进入页面及使用页面上的操作.数据权限控 ...

  4. [JSOI2016]无界单词[动态规划、kmp]

    题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...

  5. StoryLine3变量存储与跳转后台时的使用

    前言 公司项目原因,接触到storyline3(后面简称SL)课件制作工具,类似ppt,但是又多了互动.交互,且页面元素可添加触发器,触发器中可执行js代码. 1.官方教程 在SL中,会有“了解详情. ...

  6. Ubuntu apt-get提示被锁住

    执行 apt-get 时提示资源被锁住 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavai ...

  7. JS 实现计算一段文字中的字节数,字母数,数字数,行数,汉字数。

    看到了匹配,第一个想到了用正则表达式,哈哈,果然很方便.不过正则表达式高深莫测!我还没有研究明白啊..目前学了点皮毛.代码如下: <!DOCTYPE html PUBLIC "-//W ...

  8. [Beta阶段]展示博客

    一.团队成员简介与个人博客地址 团队博客地址:http://www.cnblogs.com/wowotoubuaa/ 江昊,项目经理http://www.cnblogs.com/haoj/ 王开,后端 ...

  9. Daily Scrumming* 2015.12.21(Day 13)

    一.团队scrum meeting照片 大部分成员编译请假,故今天没有开scrum meeting 二.成员工作总结 姓名 任务ID 迁入记录 江昊 无 无 任务说明: 今日准备编译测验,请假 遇到问 ...

  10. elastic-search-kibana-in-docker-dotnet-core-app

    [翻译] 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据   原文地址:http://www.dotnetcurry.com/aspnet/1354/e ...