原文地址:http://www.cnblogs.com/GXZlegend/p/6805252.html


bzoj3809

题目描述

Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。
对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。
为了方便,我们规定妹子们的美丽度全都在[1,n]中。
给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的种类数。

输入

第一行包括两个整数n,m(1<=n<=100000,1<=m<=1000000),表示数列s中的元素数和询问数。
第二行包括n个整数s1...sn(1<=si<=n)。
接下来m行,每行包括4个整数l,r,a,b(1<=l<=r<=n,1<=a<=b<=n),意义见题目描述。
保证涉及的所有数在C++的int内。
保证输入合法。

输出

对每个询问,单独输出一行,表示sl...sr中权值∈[a,b]的权值的种类数。

样例输入

10 10
4 4 5 1 4 1 5 1 2 1
5 9 1 2
3 4 7 9
4 4 2 5
2 3 4 7
5 10 4 4
3 9 1 1
1 4 5 9
8 9 3 3
2 2 1 6
8 9 1 4

样例输出

2
0
0
2
1
1
1
0
1
2

bzoj3236

题目描述

同上,只是多求了一个大小在[a,b]范围内数的个数(非数的种类数,即可以重复计算)


题解

莫队算法+分块,几乎是双倍经验

一个很显然的方法是莫队算法+树状数组,然而修改次数为n√n,修改时间为O(logn),会TLE。

由于查询次数比较少,所以可以想办法将修改时间减少,相应的增加查询时间。

这可以使用分块。

将美丽度(权值)分块,并记录每块中权值的种类数,这样在查询时只需要先找中间的块,再暴力找两边即可。

修改总时间复杂度为O(n√n*1),查询总时间复杂度为O(n*√n)。

注意查询时对两端在同一块中的特判。

对于bzoj3236,数的个数同样可以分块来求,而且相比求数的种类数更简单。

bzoj3809:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct data
{
int l , r , x , y , id;
}a[1000010];
int v[100010] , cnt[100010] , num[410] , si , ans[1000010];
bool cmp(data a , data b)
{
return (a.l - 1) / si == (b.l - 1) / si ? a.r < b.r : (a.l - 1) / si < (b.l - 1) / si;
}
int main()
{
int n , m , i , j , lp = 1 , rp = 0;
scanf("%d%d" , &n , &m) , si = (int)sqrt(n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%d%d" , &a[i].l , &a[i].r , &a[i].x , &a[i].y) , a[i].id = i;
sort(a + 1 , a + m + 1 , cmp);
for(i = 1 ; i <= m ; i ++ )
{
while(lp > a[i].l) lp -- , num[(v[lp] - 1) / si] += (!cnt[v[lp]]) , cnt[v[lp]] ++ ;
while(rp < a[i].r) rp ++ , num[(v[rp] - 1) / si] += (!cnt[v[rp]]) , cnt[v[rp]] ++ ;
while(lp < a[i].l) cnt[v[lp]] -- , num[(v[lp] - 1) / si] -= (!cnt[v[lp]]) , lp ++ ;
while(rp > a[i].r) cnt[v[rp]] -- , num[(v[rp] - 1) / si] -= (!cnt[v[rp]]) , rp -- ;
if((a[i].x - 1) / si == (a[i].y - 1) / si)
for(j = a[i].x ; j <= a[i].y ; j ++ )
ans[a[i].id] += (cnt[j] > 0);
else
{
for(j = (a[i].x - 1) / si + 1 ; j < (a[i].y - 1) / si ; j ++ ) ans[a[i].id] += num[j];
for(j = a[i].x ; j <= ((a[i].x - 1) / si + 1) * si ; j ++ ) ans[a[i].id] += (cnt[j] > 0);
for(j = (a[i].y - 1) / si * si + 1 ; j <= a[i].y ; j ++ ) ans[a[i].id] += (cnt[j] > 0);
}
}
for(i = 1 ; i <= m ; i ++ ) printf("%d\n" , ans[i]);
return 0;
}

bzoj3236,可以看到只有极小部分改动:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct data
{
int l , r , x , y , id;
}a[1000010];
int v[100010] , cnt[100010] , num[410] , sum[401] , si , ans1[1000010] , ans2[1000010];
bool cmp(data a , data b)
{
return (a.l - 1) / si == (b.l - 1) / si ? a.r < b.r : (a.l - 1) / si < (b.l - 1) / si;
}
int main()
{
int n , m , i , j , lp = 1 , rp = 0;
scanf("%d%d" , &n , &m) , si = (int)sqrt(n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%d%d" , &a[i].l , &a[i].r , &a[i].x , &a[i].y) , a[i].id = i;
sort(a + 1 , a + m + 1 , cmp);
for(i = 1 ; i <= m ; i ++ )
{
while(lp > a[i].l) lp -- , num[(v[lp] - 1) / si] += (!cnt[v[lp]]) , sum[(v[lp] - 1) / si] ++ , cnt[v[lp]] ++ ;
while(rp < a[i].r) rp ++ , num[(v[rp] - 1) / si] += (!cnt[v[rp]]) , sum[(v[rp] - 1) / si] ++ , cnt[v[rp]] ++ ;
while(lp < a[i].l) cnt[v[lp]] -- , num[(v[lp] - 1) / si] -= (!cnt[v[lp]]) , sum[(v[lp] - 1) / si] -- , lp ++ ;
while(rp > a[i].r) cnt[v[rp]] -- , num[(v[rp] - 1) / si] -= (!cnt[v[rp]]) , sum[(v[rp] - 1) / si] -- , rp -- ;
if((a[i].x - 1) / si == (a[i].y - 1) / si)
for(j = a[i].x ; j <= a[i].y ; j ++ )
ans1[a[i].id] += cnt[j] , ans2[a[i].id] += (cnt[j] > 0);
else
{
for(j = (a[i].x - 1) / si + 1 ; j < (a[i].y - 1) / si ; j ++ ) ans1[a[i].id] += sum[j] , ans2[a[i].id] += num[j];
for(j = a[i].x ; j <= ((a[i].x - 1) / si + 1) * si ; j ++ ) ans1[a[i].id] += cnt[j] , ans2[a[i].id] += (cnt[j] > 0);
for(j = (a[i].y - 1) / si * si + 1 ; j <= a[i].y ; j ++ ) ans1[a[i].id] += cnt[j] , ans2[a[i].id] += (cnt[j] > 0);
}
}
for(i = 1 ; i <= m ; i ++ ) printf("%d %d\n" , ans1[i] , ans2[i]);
return 0;
}

【bzoj3809/bzoj3236】Gty的二逼妹子序列/[Ahoi2013]作业 莫队算法+分块的更多相关文章

  1. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

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

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

  3. 【bzoj3809】Gty的二逼妹子序列

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

  4. 【BZOJ3809】Gty的二逼妹子序列 莫队 分块

    题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出区间\([l,r]\)有多少范围在\([a,b]\)的权值. \(n\leq 100000, ...

  5. 莫队p2 【bzoj3809】Gty的二逼妹子序列

    发现一篇已经够长了...所以就放在这里吧... http://hzwer.com/5749.html ↑依然是看大牛题解过的   袜子那道题太简单了.... 然后被这道题超时卡了一段时间....... ...

  6. BZOJ3809:Gty的二逼妹子序列

    浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

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

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

  8. [bzoj3809]Gty的二逼妹子序列_莫队_分块

    Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...

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

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

随机推荐

  1. 工具类(为控件设置色值) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: /* 为控件设置色值 */ #import <UIKit/UIKit.h> @interface UI ...

  2. Webpack4 学习笔记四 暴露全局变量、externals

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack 暴露全局变量 通过 expose-loader 内联配置 在 webpack中配置 每个模块通过注入的方式 通过CD ...

  3. Session和cookic

    session是无状态的方式,服务器存储机制,当用户第一次请求服务器,服务器会给客户分配一个标识id,客户端再次访问服务器,根据session id 去访问服务器数据库,返回信息,同时session ...

  4. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  5. python格式化输出的方式汇总

    %% 百分号标记 #就是输出一个%%c 字符及其ASCII码%s 字符串%d 有符号整数(十进制)%u 无符号整数(十进制)%o 无符号整数(八进制)%x 无符号整数(十六进制)%X 无符号整数(十六 ...

  6. 基于LNMP环境的ssh2扩展

    openssl: 加密算法集合,C语言实现 libssh2:ssh2协议库库,C语言实现 PECL/ssh2: libssh2的php扩展,允许php程序调用libssh2中的函数 依赖关系:PECL ...

  7. Mysql_Binary_Install_Scripts(采用二进制方式安装)

    1.1    MYSQL实现代码 #!/bin/bash ######################################## #auth:wolf_dreams #time:2018-1 ...

  8. mongdb安装配置

    一.先登录Mongodb官网https://www.mongodb.com/download-center#community 下载   安装包.32.64位的都行. 或者查看我的百度云(使用win7 ...

  9. yii2 url 美化参数

    所谓的url参数美化就是将冗长的字符串 进行正则替换 yii2 框架的url参数美化完成需要完成两个阶段 第一个阶段分apache和nginx 两种的配置 apache :1.1 必须开启rewrit ...

  10. [CodeForces948B]Primal Sport(数论)

    Description 题目链接 Solution 设f(x)为x的最大质因子 那么由题意易得\(X_1\)的范围在\([X_2-f(X_2)+1,X2]\) 同理\(X_0\)的范围在\([X_1- ...