BZOJ3236: [AHOI2013]作业


题目描述

传送门

行,我知道是Please contact lydsy2012@163.com!

传送门2

题目分析

这题两问还是非常,emmmm。

首先第一问非常好解决,随便就可以用各种各样的方法求出来。

考虑第二问,明显可以让人想到莫队。通过在颜色上分块就可以快速解决问题。

离散化还是要离散化的,luogu数据比较毒。

是代码呢

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+7;
const int inf=1e9+7;
struct Q{
int l,r,a,b,id,ans1,ans2;
inline bool operator <(const Q &rhs)const{
return id<rhs.id;
}
}q[MAXN];
int L[MAXN],R[MAXN],st[MAXN],sum[MAXN],T[MAXN],sumk[MAXN],belong[MAXN],col[MAXN],change[MAXN];
int n,m,a[MAXN],b[MAXN],t;
inline bool cmp(Q x,Q y){return belong[x.l]==belong[y.l]?x.r<y.r:x.l<y.l;}
inline void add(int x){sum[col[x]]++;sumk[belong[col[x]]]++;if(sum[col[x]]==1) change[belong[col[x]]]++;}
inline void del(int x){sum[col[x]]--;sumk[belong[col[x]]]--;if(sum[col[x]]==0) change[belong[col[x]]]--;}
inline int read()
{
int x=0,c=1;
char ch=' ';
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
while(ch=='-')c*=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*c;
}
int main()
{
n=read();m=read();
int S=sqrt(n);
for(int i=1;i<=n;i++) a[i]=b[i]=col[i]=read(),belong[i]=(i-1)/S+1;
b[n+1]=-1;b[n+2]=inf;
sort(b+1,b+n+3);
t=unique(b+1,b+n+3)-b-1;
for(int i=1;i<=n;i++) col[i]=lower_bound(b+1,b+t+1,col[i])-b; for(int i=1;i<=m;i++){
q[i].id=i;
q[i].l=read(),q[i].r=read();
q[i].a=read(),q[i].b=read();
q[i].a=lower_bound(b+1,b+t+1,q[i].a)-b;
q[i].b=upper_bound(b+1,b+t+1,q[i].b)-b-1;
}
for(int i=1;i<=n;i++) if(!L[belong[i]]) L[belong[i]]=i;
for(int i=n;i;i--) if(!R[belong[i]]) R[belong[i]]=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l) del(l++);
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(r>q[i].r) del(r--);
if(q[i].a>q[i].b) continue;
if(belong[q[i].a]==belong[q[i].b]){
for(int j=q[i].a;j<=q[i].b;j++) if(sum[j]) q[i].ans1+=sum[j],q[i].ans2++;
continue;
}
for(int j=q[i].a;j<=R[belong[q[i].a]];j++) if(sum[j]) q[i].ans1+=sum[j],q[i].ans2++;
for(int j=belong[q[i].a]+1;j<belong[q[i].b];j++) q[i].ans1+=sumk[j],q[i].ans2+=change[j];
for(int j=L[belong[q[i].b]];j<=q[i].b;j++) if(sum[j]) q[i].ans1+=sum[j],q[i].ans2++;
}
sort(q+1,q+m+1);
for(int i=1;i<=m;i++) printf("%d %d\n", q[i].ans1,q[i].ans2);
}

BZOJ3236: [AHOI2013]作业的更多相关文章

  1. [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业

    [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业 bzoj   bzoj 题目大意:一个序列,m个询问在$[l,r]$区间的$[x,y]$范围内的数的个数/种类. ...

  2. BZOJ3236 [Ahoi2013]作业 【莫队 + 树状数组】

    题目链接 BZOJ3236 题解 没想到这题真的是如此暴力 #include<algorithm> #include<iostream> #include<cstring ...

  3. [BZOJ3236]:[Ahoi2013]作业(莫队+分块)

    题目传送门 题目描述 此时已是凌晨两点,刚刚做了$Codeforces$的小$A$掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可与做完的数学作业,接下来是分别都是一个小时可 ...

  4. BZOJ3236: [Ahoi2013]作业

    Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...

  5. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  6. BZOJ3236:[AHOI2013]作业(莫队,分块)

    Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...

  7. BZOJ3236: [Ahoi2013]作业 树状数组维护 莫队

    水果~~~~ 关于四个while可行性的证明:区间有正确性所以不管那团小东西用没有duang~反它最终总会由于两次覆盖二准确 关于区间种数可行性的证明:他会在0 1间(或两边)来回跳动(过程中),最终 ...

  8. 【莫队算法】【权值分块】bzoj3236 [Ahoi2013]作业

    莫队显然.然后维护转移的时候如果用树状数组,则很容易TLE.所以用权值分块维护转移. 总复杂度O(m*sqrt(n)). #include<cstdio> #include<algo ...

  9. [BZOJ3236][AHOI2013]作业:树套树/莫队+分块

    分析 第一问随便搞,直接说第二问. 令原数列为\(seq\),\(pre_i\)为\(seq_i\)这个值上一个出现的位置,于是可以简化询问条件为: \(l \leq i \leq r\) \(a \ ...

  10. bzoj3809 Gty的二逼妹子序列 & bzoj3236 [Ahoi2013]作业 莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. 【Flask】在Flask中使用logger

    https://blog.csdn.net/yannanxiu/article/details/53557657 Flask在0.3版本后就有了日志工具logger,在Flask的官方文档中这么记载: ...

  2. 服务器初识、linux安装、linux初识

    电脑硬件 电源 既然是人体的心脏,保障电源供应,就需要质量好的电源,生产环境中单个核心服务器最好是双电源AB线路. 一个接220V电路,一个可能接蓄电池UPS(不间断电源) cpu 常见品牌:Inte ...

  3. lock,Monitor,Mutex的区别

    lock和Monitor的区别 一.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 二.Monitor有TryEnter的功能,可以防止出现死锁的问题,lo ...

  4. nodejs跨平台应用

    nodejs官网https://nodejs.org/download/release/ 一.发行版 1)ubuntu sudo apt-get install nodejssudo apt-get ...

  5. H5移动端的一些坑、、、

    H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...

  6. linux automake使用

    一篇文章: 一.Makefile介绍 Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有 ...

  7. java通过url抓取网页数据-----正则表达式

    原文地址https://www.cnblogs.com/xiaoMzjm/p/3894805.html [本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西 ...

  8. iis7.5安装配置php环境详细清晰教程,三步实现【图文】

    iis7.5安装配置php环境详细清晰教程,三步实现[图文] iis7.5是安装在win7.win8里的web服务器,win2003.win2000的web服务器使用的是iis6.0,由于win7.w ...

  9. Creating an generated Earth AVI with C++

    Creating an generated Earth AVI with C++        EarthGenerator.cpp /*    EarthGenerator.cpp An examp ...

  10. [Windows Powershell]-学习笔记(1)

      Powershell 快捷键 Powershell的快捷键和cmd,linux中的shell,都比较像.   ALT+F7     清除命令的历史记录 PgUp PgDn     显示当前会话的第 ...