BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业
题目大意:
此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷。英语作业其实不算多,一个小时刚好可以做完。然后是一个小时可以做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文......小A压力巨大。woc他竟然一个小时搞完语文卷子
这是小A碰见了一道非常恶心的数学题,给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间表示数列的第l个数到第r个数),首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小于等于b的,且在该区间中出现过的数值的个数。
小A望着那数万的数据规模几乎绝望,只能向大神您求救,请您帮帮他吧。
这么说其实不太清楚,说白了就是一个是可以记录重复的而一个不能
输入格式
第一行n,m
接下来n个数表示数列
接下来m行,每行四个数l,r,a,b
输出格式
输出m行,分别对应每个询问,输出两个数,分别为在l到r这段区间中大小在[a,b]中的数的个数,以及大于等于a,小于等于b的,且在该区间中出现过的数值的个数(具体可以参考样例)。
样例
样例输入
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
题解:
我们采用莫队的算法,将询问的区间排序
维护两个权值树状数组,一个是可以重复的树状数组A,一个是不能重复的树状数组B,
我们在删除操作时,对于那个可以有重复的树状数组A,我们无条件删除它
而那个不能重复的树状数组B,我们需要判断能否删去
开一个数组,cnt[i]表示权值i出现的次数
如果我们在删除一个i后cnt[i]变成了0,说明现在区间中没有权值i出现,那么我们就可以删去它
对于加的操作,其实是一样的,对于树状数组A,我们无条件加上它
对于树状数组B,如果当前cnt[i]==0,那么说明i是一个新出现的值,需要在树状数组B中加入i
最后一遍询问[a,b]就可得出答案
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#define MAXN 100005
#define MAXM 1000005
#define ll long long
#define re register
using namespace std;
ll n,m,a[MAXN],block[MAXM],blo,l=1,r=0,ans1[MAXM],ans2[MAXM],cnt[MAXN];
struct node{
ll l,r,a,b,id;
friend inline bool operator < (node a,node b){
return block[a.l]==block[b.l]?a.r<b.r:a.l<b.l;
}
}ask[MAXM];
struct BIT{
ll c[MAXN];
ll lowbit(re ll x){return x&(-x);}
inline void update(re ll pos,re ll data){
while(pos<=n){
c[pos]+=data;
pos+=lowbit(pos);
}
}
inline ll query(re ll pos){
re ll sum=0;
while(pos>0){
sum+=c[pos];
pos-=lowbit(pos);
}
return sum;
}
}tree1,tree2;
inline void add(re ll x){
if(x==0) return ;
tree1.update(x,1);
if(cnt[x]==0) tree2.update(x,1);
cnt[x]++;
}
inline void del(re ll x){
if(x==0) return ;
tree1.update(x,-1);
cnt[x]--;
if(cnt[x]==0) tree2.update(x,-1);
}
signed main(){
scanf("%lld%lld",&n,&m);
blo=(ll)sqrt(n);
for(re ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(re ll i=1;i<=m;i++){
scanf("%lld%lld%lld%lld",&ask[i].l,&ask[i].r,&ask[i].a,&ask[i].b);
ask[i].id=i;
block[i]=i/blo+1;
}
sort(ask+1,ask+m+1);
for(re ll i=1;i<=m;i++){
while(l<ask[i].l) del(a[l++]);
while(l>ask[i].l) add(a[--l]);
while(r>ask[i].r) del(a[r--]);
while(r<ask[i].r) add(a[++r]);
ans1[ask[i].id]=tree1.query(ask[i].b)-tree1.query(ask[i].a-1);
ans2[ask[i].id]=tree2.query(ask[i].b)-tree2.query(ask[i].a-1);
}
for(re ll i=1;i<=m;i++)
printf("%lld %lld\n",ans1[i],ans2[i]);
return 0;
}
BZOJ 3236 AHOI 2013 作业 莫队+树状数组的更多相关文章
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- 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 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- bzoj 3289 : Mato的文件管理 (莫队+树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...
- [AHOI2013]作业 莫队 树状数组
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...
随机推荐
- csp-s模拟100,101T1,T2题解
题面:https://www.cnblogs.com/Juve/articles/11799325.html 我太蒻了只会T1T2 组合: 欧拉路板子?不会呀... 然后打了个优化,防止暴栈 #inc ...
- H5页面在手机上查看 使用手机浏览自己的web项目
参考:http://www.browsersync.cn/#install 首先全局安装BrowserSync : npm install -g browser-sync 其次在项目文件夹下运行: b ...
- (转)HttpURLConnection中设置网络超时
转:http://www.xd-tech.com.cn/blog/article.asp?id=37 Java中可以使用HttpURLConnection来请求WEB资源.HttpURLConnect ...
- hdu多校第二场1011 (hdu6601) Keen On Everything But Triangle 主席树
题意: 给定一个数列,每次询问一个区间,问这个区间中的值可组成的周长最大的三角形的周长. 题解: 定理1:给定一些值,这些值中组成边长最大的三角形的三条边的大小排名一定是连续的. 证明:假如第k大,第 ...
- iOS开发之SceneKit框架--SCNCamera.h
1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...
- UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...
- Spring 声明式事务管理(11)
案例分析 本案例是图书管理系统精简部分,在数据库中有3张表.分别保存图书库存.图书信息和用户信息.下面是建表SQL语句 1 DROP TABLE IF EXISTS store; 2 DROP TAB ...
- Leetcode166. Fraction to Recurring Decimal分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入: numerator ...
- node vue 微信公众号(三)启用本地服务器
1.下载nginx http://nginx.org/en/download.html 2.启动服务 3.配置natapp服务,并启动
- leetcode-80-删除排序数组中的重复项②
题目描述: 第一次提交: class Solution: def removeDuplicates(self, nums: List[int]) -> int: nums.reverse() f ...