问题: 作业

时间限制: 10 Sec  内存限制: 512 MB

题面


题目描述

此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷。英语作业其实不算多,一个小时刚好可以做完。然后是一个小时可以做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文......小A压力巨大。

这是小A碰见了一道非常恶心的数学题,给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间表示数列的第l个数到第r个数),首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小于等于b的,且在该区间中出现过的数值的个数。

小A望着那数万的数据规模几乎绝望,只能向大神您求救,请您帮帮他吧。

输入格式

第一行n,m

接下来n个数表示数列

接下来m行,每行四个数l,r,a,b

输出格式

输出m行,分别对应每个询问,输出两个数,分别为在l到r这段区间中大小在[a,b]中的数的个数,以及大于等于a,小于等于b的,且在该区间中出现过的数值的个数(具体可以参考样例)。

题解


这题不算太难。不过帮我复习了一下树状数组。

一句话题解:莫队,放两个树状数组维护区间信息统计答案。

详细部分:

放按数据大小维护的两个树状数组,存每个数据出现的次数。一个用于维护所有数据,另一个用于维护数据是否存在(去重后的数据)。

随着莫队在区间上的伸缩不断调整树状数组内的数据,

然后利用树状数组的区间查询操作查询就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define rint register long long
#define int long long
using namespace std;
int n,m,a[],l,r,t1[],t2[],cnt[],belong[],sum_q;
struct node{int l,r,id,a,b,ans1,ans2;}que[];
int lowbit(int x){return x&(-x);}
bool cmp(node xx,node yy){return belong[xx.l]==belong[yy.l]?xx.r<yy.r:xx.l<yy.l;}
bool cmp_id(node x,node y){return x.id<y.id;}
void update1(int x,int num){for(;x<=n;x+=lowbit(x))t1[x]+=num;}
void update2(int x,int num){for(;x<=n;x+=lowbit(x))t2[x]+=num;}
int query1(int x){int tot=;for(;x;x-=lowbit(x))tot+=t1[x];return tot;}
int query2(int x){int tot=;for(;x;x-=lowbit(x))tot+=t2[x];return tot;}
void add(int x){if(++cnt[x]==)update2(x,);update1(x,);}
void del(int x){if(--cnt[x]==)update2(x,-);update1(x,-);}
signed main()
{
scanf("%lld %lld",&n,&m);sum_q=sqrt(1ll*n*n/m);
for(rint i=;i<=n;++i){scanf("%lld",&a[i]);belong[i]=i/sum_q+;}
for(rint i=;i<=m;++i){scanf("%lld %lld %lld %lld",&que[i].l,&que[i].r,&que[i].a,&que[i].b);que[i].id=i;}
sort(que+,que+m+,cmp);l=que[].l,r=que[].r;
for(rint i=l;i<=r;++i)add(a[i]);
que[].ans1=query1(que[].b)-query1(que[].a-);
que[].ans2=query2(que[].b)-query2(que[].a-);
for(rint i=;i<=m;++i)
{
while(l<que[i].l){del(a[l]);l++;}while(l>que[i].l){l--;add(a[l]);}
while(r<que[i].r){r++;add(a[r]);}while(r>que[i].r){del(a[r]);r--;}
que[i].ans1=query1(que[i].b)-query1(que[i].a-);
que[i].ans2=query2(que[i].b)-query2(que[i].a-);
}
sort(que+,que+m+,cmp_id);
for(rint i=;i<=m;++i){cout<<que[i].ans1<<" "<<que[i].ans2<<endl;}
return ;
}

比日志里的那个正常一点

「题解」:[AHOI2013]作业的更多相关文章

  1. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  2. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  3. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  4. 「题解」:[loj2763][JOI2013]现代豪宅

    问题 A: 现代豪宅 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...

  5. 「题解」:$Six$

    问题 A: Six 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 来写一篇正经的题解. 每一个数对于答案的贡献与数本身无关,只与它包含了哪几个质因数有关. 所以考虑二 ...

  6. 「题解」:$Smooth$

    问题 A: Smooth 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 维护一个队列,开15个指针,对应前15个素数. 对于每一次添加数字,暴扫15个指针,将指针对应 ...

  7. 「题解」:Kill

    问题 A: Kill 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 80%算法 赛时并没有想到正解,而是选择了另一种正确性较对的贪心验证. 对于每一个怪,我们定义它的 ...

  8. 「题解」:y

    问题 B: y 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 考虑双向搜索. 定义$cal_{i,j,k}$表示当前已经搜索状态中是否存在长度为i,终点为j,搜索过边 ...

  9. 「题解」:x

    问题 A: x 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...

随机推荐

  1. Model Maker上手指南

    Model Maker上手指南 目录 1.MM可爱的脸 2.MM中的工程Project 3.新建类图 4.添加类成员 5.实现类的方法 6.生成Delphi代码 7.逆向到模型 8.完全的逆向工程 作 ...

  2. class4_Listbox 列表部件

    最终的运行效果图: #!/usr/bin/env python# -*- coding:utf-8 -*-# --------------------------------------------- ...

  3. 注意:字符串substring方法在jkd6,7,8中的差异。

    标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的. substring有什么用? sub ...

  4. 通过Matlab SDK 获取tushare数据

    概要说明 版本要求:Matlab需要2016b及以上版本 接口说明:可以用help pro_api和help pro_bar查看 demo程序:请参考tushare_pro_test.m文件 程序包下 ...

  5. C++之运算符_算数运算符

    运算符 **作用:**用于执行代码的运算 | **运算符类型** | **作用** || -------------- | -------------------------------------- ...

  6. 事务和JDBC事务隔离级别

    与事务相关的理论 mysql事物隔离级别:http://mj4d.iteye.com/blog/1744276 事务(Transaction): 是并发控制的单元,是用户定义的一个操作序列.这些操作要 ...

  7. Spark SQL设计

  8. CTR预估的常用方法

    1.CTR CTR预估是对每次广告的点击情况做出预测,预测用户是点击还是不点击. CTR预估和很多因素相关,比如历史点击率.广告位置.时间.用户等. CTR预估模型就是综合考虑各种因素.特征,在大量历 ...

  9. The linux command之高级键盘技巧

    一.光标移动 二.修改文本 三.剪切和粘贴文本 四.使用历史命令

  10. css---8 过渡属性刨析

    1.       transition-property 默认值为 all,表示所有可被动画的属性都表现出过渡动 可以指定多个 property 属性值: none 没有过渡动画. all 所有可被动 ...