[AHOI2013]作业 & Gty的二逼妹子序列 莫队
题解:
题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队。
考虑区间[l, r]转移到[l, r + 1],那么对于维护个数的树状数组就直接加即可。
对于维护种数的树状数组,我们额外维护一个数组num,表示数a在区间内出现了多少次,如果是新出现的,那么就加入树状数组。
如果要删除一个数并且这个数在区间内只出现了一次,那么就删除这个数。注意不论什么情况都要实时维护num数组。
然后莫队即可。
Gty的二逼妹子序列是洛谷P4867和作业的某一问是一模一样的,把数组开大点就可以过。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 100100 int n, m, cnt, block;
int ans1[AC], ans2[AC], s[AC], num[AC], tot[AC]; struct node{
int l, r, a, b, id;
}q[AC]; inline int lowbit(int x)
{
return x & (-x);
} struct kkk{
int a[AC]; void add(int x, int y)
{
for(R i = x; i <= cnt; i += lowbit(i)) a[i] += y;
} int find(int x)
{
int rnt = ;
for(R i = x; i; i -= lowbit(i)) rnt += a[i];
return rnt;
}
}c1, c2; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} int half(int x)//查询离散化后的值
{
int l = , r = cnt, mid;
while(l < r)
{
mid = (l + r) >> ;
if(num[mid] == x) return mid;
else if(num[mid] > x) r = mid;
else l = mid + ;
}
return l;
} int half1(int x)//查询最小的大于等于a的值
{
int l = , r = cnt, mid;
if(num[cnt] < x) return cnt + ;
while(l < r)
{
mid = (l + r) >> ;
if(num[mid] >= x) r = mid;
else l = mid + ;
}
return l;
} int half2(int x)//查询最大的小于等于b的值
{
int l = , r = cnt, mid;
if(num[] > x) return ;
while(l < r)
{
mid = (l + r + ) >> ;//强制偏右
if(num[mid] > x) r = mid - ;
else l = mid;
}
return l;
} inline bool cmp(node a, node b)
{
if(a.l / block != b.l / block) return a.l < b.l;
else return a.r < b.r;//分块排序
} void pre()
{
n = read(), m = read(), block = sqrt(n);
for(R i = ; i <= n; i ++) s[i] = num[i] = read();
sort(num + , num + n + );
for(R i = ; i <= n; i ++)
if(num[i] != num[i + ]) num[++cnt] = num[i];
for(R i = ; i <= n; i ++) s[i] = half(s[i]);//在这里离散化,这样后面就不用调用了
for(R i = ; i <= m; i ++)
{
q[i].l = read(), q[i].r = read(), q[i].id = i;
q[i].a = half1(read()), q[i].b = half2(read());
}
sort(q + , q + m + , cmp);
} void add(int x)
{
c1.add(x, );
if(!tot[x]) c2.add(x, );
++ tot[x];
} void del(int x)
{
c1.add(x, -);
-- tot[x];
if(!tot[x]) c2.add(x, -);
} void work()//这里每个点的贡献与区间无关,相对独立,所以不用考虑顺序问题
{
int l, r;
for(R i = q[].l; i <= q[].r; i ++) add(s[i]);
ans1[q[].id] = c1.find(q[].b) - c1.find(q[].a - );
ans2[q[].id] = c2.find(q[].b) - c2.find(q[].a - );
l = q[].l, r = q[].r;
for(R i = ; i <= m; i ++)
{
int ll = q[i].l, rr = q[i].r;
while(ll < l) -- l, add(s[l]);
while(ll > l) del(s[l]), ++ l;
while(rr > r) ++ r, add(s[r]);
while(rr < r) del(s[r]), -- r;
ans1[q[i].id] = c1.find(q[i].b) - c1.find(q[i].a - );
ans2[q[i].id] = c2.find(q[i].b) - c2.find(q[i].a - );
}
for(R i = ; i <= m; i ++) printf("%d %d\n", ans1[i], ans2[i]);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}
[AHOI2013]作业 & Gty的二逼妹子序列 莫队的更多相关文章
- Bzoj 3809: Gty的二逼妹子序列 莫队,分块
3809: Gty的二逼妹子序列 Time Limit: 35 Sec Memory Limit: 28 MBSubmit: 868 Solved: 234[Submit][Status][Dis ...
- BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- [BZOJ3809]Gty的二逼妹子序列[莫队+分块]
题意 给出长度为 \(n\) 的序列,\(m\) 次询问,每次给出 \(l,r,a,b\) ,表示询问区间 \([l,r]\) 中,权值在 \([a,b]\) 范围的数的种类数. \(n\leq 10 ...
- 【BZOJ3809】Gty的二逼妹子序列 莫队 分块
题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出区间\([l,r]\)有多少范围在\([a,b]\)的权值. \(n\leq 100000, ...
- bzoj 3809 Gty的二逼妹子序列——莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 容易想到树状数组维护值域.但修改和查询都是 log 太慢. 考虑有 nsqrt(n) ...
- bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段 ...
- 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块
[BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...
- [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业
[bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业 bzoj bzoj 题目大意:一个序列,m个询问在$[l,r]$区间的$[x,y]$范围内的数的个数/种类. ...
- 3809: Gty的二逼妹子序列
3809: Gty的二逼妹子序列 链接 分析: 和这道AHOI2013 作业差不多.权值是1~n的,所以对权值进行分块.$O(1)$修改,$O(\sqrt n)$查询. 代码: #include< ...
随机推荐
- (四)启用HTTPS
安全规范中有一条是要求尽量使用https而弃用http(新Chrome将标记非HTTPS网站为不安全),其实启用https和之前的ipv6改造一样,并不是什么高难度或者工作流繁多的的改造,只需将中间件 ...
- 九、IIC驱动原理分析
学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...
- WHERE条件中or与union引起的全表扫描的问题
说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...
- JavaSE基础复习---2---2018/9/28
目录: 1.数据类型 2.变量 3.数组 1.数据类型 谈到java的数据类型,必须知道java是强类型语言.首先,每个变量有类型,每个表达式有类型,而且每种类型是严格定义的.其次,所有的数值传递,不 ...
- [Codeforces888E]Maximum Subsequence(暴力+meet-in-the-middle)
题意:给定n.m.有n个数,选出若干数加起来对m取模,求最大值 n<=35 如果直接暴力就是235,会T, 这里用到一个思想叫meet-in-the-middle, 就是把数列分成两半分别搜索, ...
- 数列分块入门 1 LOJ6277
题目描述 给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 n. 第二行输入 n 个数字,第 iii 个数字为 ai,以空格隔开. 接下来输 ...
- SQLServer 将日期改造成标准日期格式(如: 2016/6 ->201606)
同事给了份Excel 数据,导到数据库之后再查出来时发现顺序不好弄.于是想从数据源中做处理. 由于数据存在,年/月 与 年/月/日 的格式不好用datetime保存,于是用varchar保存. 数据处 ...
- MVC4+EF 列表数据不能绑定
最新准备使用.net 的mvc+Ef来写个项目,开始一切顺利,到了数据绑定时出现了问题. 我的mvc视图引擎是Razor,后台提取数据的是Linq来处理,发现不管怎么样都不能绑定列表数据,可以将后台的 ...
- 集成运放输入电压范围指标参数Uicmax,Uidmax
图中Uicmax最大共模输入电压:是运放能正常工作下的最大输入电压: Uidmax最大差模输入电压:是运放要损坏的最大输入电压
- Android使用butterknife注解出现nullPointerException解决
1.下载butterknife加入到你的libs中,构建到你的项目中,此时还不能注解成功,必须进行2配置 2.选择你的项目右键---->properties----->java compi ...