全部从我大哥那里学习得来。。

一开始硬着头皮就是根据思路上线段树,明知是T还要写(因为线段树还不是很熟,趁机练一发)

后来果然T了,然后就去学了一发RMQ的ST算法,查询是O(1)。

ST算法主要:

//把dp[i,j]平均分成两段

//(因为dp[i,j]一定是偶数个数字),从 i 到i + 2 ^ (j - 1) - 1为一段,

//i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1))。

然后就在两秒内AC了…

主要是想证明那个复杂度的理解吧。

如果a>=b,那么a%b<=a/2;

那么我们每次对当前找最近小的那个,通过二分区间(O(logn))然后RMQ的查询是O(1)那么最终常熟复杂度还是log(A[i])了,总的复杂度就理所当然是qO(logn)O(logA[i])。然后叉姐题解说是卡常数。。= =、汗

下面引述我大哥的…

原文链接:http://www.wonter.net/index.php/archives/1012/

思路:

对于每一个 [l, r] 区间,也就是求 a[l] % a[l + 1] % a[l + 2] + … + a[r]

直接暴力肯定会 T 的,但我们会发现。如果一个数 % 一个比它大的数字,实际上这个数字是不变的,所以对于每个询问,我们只需要每次 % 一个比当前结果小的就好了

我们可以使用 rmq 求区间最小值,然后二分求出距离当前这个位置最近的而且小于当前结果的数,然后 % 它,更新位置和答案即可。

#include <bits/stdc++.h>
using namespace std; int arr[100010];
int dp[100010][20];
int mm[100010];
int n;
void RMQInit()
{
mm[0] = -1;
for(int i = 1;i <= n;++i)
{
mm[i] = ((i & (i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];
dp[i][0] = arr[i];
}
for(int j = 1; j <= mm[n]; ++j)
{
for(int i = 1; i + (1 << j) - 1 <= n; ++i)
{
dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
}
int Query(int l, int r)
{
int t = mm[r - l + 1];
return min(dp[l][t], dp[r - (1 << t) + 1][t]);
}
int GetPos(int l, int r, int x)
{
int left = l, right = r;
while(left < right)
{
int mid = left + ((right - left) >> 1);
if(Query(l, mid) <= x)
right = mid;
else
left = mid + 1;
}
if(arr[left] <= x)
return left;
return -1;
}
int main()
{
//freopen("1.in", "r", stdin);
int T;
while(scanf("%d", &T) == 1)
{
while(T--)
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &arr[i]);
RMQInit();
int q;
scanf("%d", &q);
for(int i = 1; i <= q; ++i)
{
int l, r;
scanf("%d%d", &l, &r);
int ans = arr[l];
while(l != r)
{
int pos;
pos = GetPos(l + 1, r, ans);
if(pos == -1)
break;
l = pos;
ans %= arr[l];
}
printf("%d\n", ans);
}
}
}
return 0;
}

hdoj5875【二分+RMQ】的更多相关文章

  1. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

    全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...

  2. 2016 ACM/ICPC Asia Regional Dalian Online 1008 Function 二分+RMQ

    Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  3. HDU 5289 Assignment(2015 多校第一场二分 + RMQ)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  4. Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]

    题意Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80 ...

  5. 【BZOJ5083】普及 单调栈+二分+RMQ

    [BZOJ5083]普及 Description 有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(从左到右或从右到左一个一个取出),使得 不管是从左往右还是从右往左取,都保证每时每刻 ...

  6. Codeforces Round #278 (Div. 1) Strip (线段树 二分 RMQ DP)

    Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  7. HDU - 5289:Assignment(单调队列||二分+RMQ||二分+线段树)

    Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this com ...

  8. gym101201J Shopping 二分+RMQ+数学性质

    题目传送门 题目大意: 给出n个商品的价格,排成一列,q次查询,每次查询如果你有x的钱,从l格子走到r格子,每种商品有无数个,能买就买,最后还会剩多少钱. 思路: 每一次买都要找离自己最近的且买的起的 ...

  9. 【BZOJ3230】相似子串 后缀数组+二分+RMQ

    [BZOJ3230]相似子串 Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出 ...

随机推荐

  1. 监控hadoop任务结果shell脚本

    需求:每日hadoop结果文件中,找出数据不完整的日期和没有跑出数据的日期,重新进行跑hadoop任务 分析:在result/目录生成的文件中数据有2个特点 第一:日期有,但是数据不完整 第二:日期对 ...

  2. 统计 与 数学 induction 归纳 deduction 演绎 吴喜之老师

    “统计的思维方式是归纳(induction),也就是从数据所反映的现实得到比较一般的模型,希望以此解释数据所代表的那部分世界.这和以演绎(deduction)问哦主的数学思维方式相反,演绎是在一些人为 ...

  3. 配置tomcat,实现域名访问项目

    首先,配置tomcat端口号为80,配置方法:配置tomcat,访问端口改为80 然后,配置访问项目时候,不用项目名,配置方法:配置tomcat,使访问项目时候无项目名 最后,配置tomcat的ser ...

  4. php命名空间使用总结

    从php5.3开始可以使用命名空间,命名空间是为了防止命名 空间的元素重复而使用的.命名空间的元素包括:class.function.const(从php5.3开始在类外部也可以用const定义常量, ...

  5. SpringSecurityLDap

    ldap,用于用户登录的权限管理, 可参考:http://www.cnblogs.com/icuit/archive/2010/06/10/1755575.html

  6. zabbix 中 宏 的介绍

    宏的作用是便于在模板.items.trigger中的引用.宏的名称为 {$名称},宏的字符范围为 A~Z.0~9._ . 例如: 在key中的宏: net.tcp.service[ssh,{$SSH_ ...

  7. codeforces 140B.New Year Cards 解题报告

    题目链接:http://codeforces.com/problemset/problem/140/B 题目意思:给出 Alexander 和他的 n 个朋友的 preference lists:数字 ...

  8. codeforces B. Ciel and Flowers 解题报告

    题目链接:http://codeforces.com/problemset/problem/322/B 题目意思:给定红花.绿花和蓝花的朵数,问组成四种花束(3朵红花,3朵绿花,3朵蓝花,1朵红花+1 ...

  9. APTM敏捷性能测试模型

    随着应用系统的日趋复杂,仅在系统测试和验收测试阶段执行性能测试已经不能满足迟早发现和解决系统性能瓶颈的要求,Connie Smith博士和Lloyd Winlliams博士在他们提出 的软件性能工程( ...

  10. poj3181【Dollar Dayz】

    做完这道题,心里五味陈杂,明明是最水的一道题,我却做了最长的时间. 题意是求用1-k的和表示n的方案数. 显然是个计数dp,但我不会.思考半小时未果. 然后找尹鹏哲,他给我讲了个错的dp方程,结果调试 ...