链接:

P4867


题意:

给出长度为 \(n(1\leq n\leq 10^5)\) 的序列 \(s\),保证\(1\leq s_i\leq n\)。有 \(m(1\leq m\leq 10^6)\) 次询问,每次询问给出 \(4\) 个整数 \(l,r,a,b(1\leq l\leq r\leq n,1\leq a\leq b\leq n)\),询问在 \([l,r]\) 的序列中有多少权值属于 \([a,b]\)。


分析:

感觉这道题和数颜色有一点像,区别是有值域的范围限制。看操作可以离线,所以首先就考虑莫队了,所以我开了两个树状数组存数量和种类,写出了大常数的 \(O(m\sqrt n\log n)\),开了 O2 还能卡过,不开就爆掉了。

莫队移动的时间复杂度是 \(O((n+m)\sqrt n)\) 这里视为 \(O(m\sqrt n)\),已经很大了,所以对修改和查询的时间复杂度有比较大的要求。这里注意到 \(a,b\) 有着良好的性质:\(1\leq a\leq b\leq n\) 使得我们可以对值域进行分块,从而做到 \(O(1)\) 修改,\(O(\sqrt n)\) 查询,于是总的时间复杂度为 \(O(m\sqrt n)\)。


代码:
#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=1e5+5;
const int Q=1e6+5;
int a[N],n,m,T,tl,tr;
struct ques{
int l,r,L,R,o;
}q[Q];
inline int k(int x){return (x-1)/T+1;}
inline bool cmp(ques x,ques y){
tl=k(x.l),tr=k(y.l);
if(tl!=tr)return tl<tr;
return (tl&1)?x.r>y.r:x.r<y.r;
}
int s[N],S[N];
void add(int x){s[x]++;S[k(x)]+=(s[x]==1);}
void del(int x){s[x]--;S[k(x)]-=(s[x]==0);}
int que(int l,int r){
int res=0;tl=k(l),tr=k(r);
if(tl==tr||tr-tl==1)
for(int i=l;i<=r;i++) res+=s[i]?1:0;
else{
for(int i=tl+1;i<=tr-1;i++) res+=S[i];
for(int i=l;i<=tl*T;i++) res+=s[i]?1:0;
for(int i=(tr-1)*T+1;i<=r;i++) res+=s[i]?1:0;
}
return res;
}
int ans[Q];
signed main(){
n=in,m=in;T=sqrt(n);
for(int i=1;i<=n;i++)a[i]=in;
for(int i=1;i<=m;i++)
q[i].l=in,q[i].r=in,q[i].L=in,q[i].R=in,q[i].o=i;
sort(q+1,q+1+m,cmp);
int tl=1,tr=0;
for(int i=1;i<=m;i++){
int l=q[i].l,r=q[i].r,L=q[i].L,R=q[i].R,o=q[i].o;
while(tr<r)add(a[++tr]);
while(tr>r)del(a[tr--]);
while(tl<l)del(a[tl++]);
while(tl>l)add(a[--tl]);
ans[o]=que(L,R);
}
for(int i=1;i<=m;i++)
cout<<ans[i]<<'\n';
return 0;
}

洛谷 P4867 Gty的二逼妹子序列的更多相关文章

  1. 洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)

    传送门 本来打算用主席树 然后发现没办法维护颜色数 于是用了莫队加树状数组 然后竟然A了…… //minamoto #include<iostream> #include<cstdi ...

  2. P4867 Gty的二逼妹子序列

    题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美 ...

  3. 【题解】Luogu P4867 Gty的二逼妹子序列

    原题传送门 同Luogu P4396 [AHOI2013]作业 询问多了10倍,但还能跑过(smog #include <bits/stdc++.h> #define N 100005 # ...

  4. [AHOI2013]作业 & Gty的二逼妹子序列 莫队

    ---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...

  5. BZOJ 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1387  Solved: 400[Submit][Status][Di ...

  6. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  7. Bzoj 3809: Gty的二逼妹子序列 莫队,分块

    3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Dis ...

  8. 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 链接 分析: 和这道AHOI2013 作业差不多.权值是1~n的,所以对权值进行分块.$O(1)$修改,$O(\sqrt n)$查询. 代码: #include< ...

  9. 【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1728  Solved: 513 Description Autumn ...

随机推荐

  1. C# Collection

    数组与集合不同的适用范围: 数组:数组最适用于创建和使用固定数量的强类型化对象. 集合:集合提供更灵活的方式来使用对象组. 与数组不同,你使用的对象组随着应用程序更改的需要动态地放大和缩小. 对于某些 ...

  2. Vue个人博客关于标题自动打字机效果Typewriter

    最近在写个人Blog 中间看过很多个人博客的开发 一大部分用的是Hexo框架或者vuePress框架 导入各种主题样式插件等等 但是看多了就会发现 很多博主的个人博客基本都很相似 并没有什么新东西呈现 ...

  3. webpack 安装与卸载

    全局安装(不推荐): npm install webpack webpack-cli -g 安装好后打印版本: webpack -v webpack-cli -v 卸载全局 npm uninstall ...

  4. Shell系列(2)- 脚本执行方式

    创建shell脚本 [root@localhost sh]# vim hello.sh  shell脚本必须用.sh,同时方便文件管理 #!/bin/bash:shell文件第一行必须是这个,声明这个 ...

  5. 最推荐的抓包工具charles

    Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当浏览器连接Charles的代理访问互联网时,Charles可以监控浏览器发送和接收的所有数据.它允许一个开发者查看所有连接互联 ...

  6. python操作Redis方法速记

    redis有5种数据结构,分别如下: 5种数据结构 python语言对5种数据结构的增删改查 全局函数 redis 连接 import redis pool = redis.ConnectionPoo ...

  7. 10-Java中共享内存可见性以及synchronized和volatile关键字

    Java中共享变量的内存可见性 我们首先来看一下在多线程下处理共享变量时Java的内存模型,如图所示 Java内存模型规定,将所有的变量都存放在主存中,当线程使用变量的时候,会把主内存里面的变量赋值到 ...

  8. NOIP模拟69

    T1 石子游戏 大坑未补 T2 大鱼吃小鱼 解题思路 set+桶可以得到 60pts (code) 线段树上二分每一次优先递归右区间从右区间贪心选择,并且记录下更改过的值,在处理完答案之后再复原回去. ...

  9. 2.1 附录--JVM指令手册

    栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将 ...

  10. 函数式编程 —— 将 JS 方法函数化

    前言 JS 调用方法的风格为 obj.method(...),例如 str.indexOf(...),arr.slice(...).但有时出于某些目的,我们不希望这种风格.例如 Node.js 的源码 ...