gym101201J Shopping 二分+RMQ+数学性质
题目大意:
给出n个商品的价格,排成一列,q次查询,每次查询如果你有x的钱,从l格子走到r格子,每种商品有无数个,能买就买,最后还会剩多少钱。
思路:
每一次买都要找离自己最近的且买的起的商品,这样可以二分区间,用线段树(rmq问题,可以用st表)找到离自己最近且买得起的商品,然后不断的向r逼近,最后就是答案。
这个思路为什么不会超时的呢,因为可以想象,每次买完一个商品,你的剩余的钱最多也是这个商品价格的余数,而后面你买的起的商品价格肯定比这个小,所以稍微举几个例子就发现不会枚举几次的,有点像斐波那契数列的递减。(最坏的情况是商品价格为7,6,5,4,3,2,1,这样的时间复杂度也许会退化,但发现如果能走完这个过程,至少也要有28块钱,这个钱在买7的时候会直接用完,所以时间复杂度不会退化)。
借用了队友写的代码,st表解决RMQ真的好短。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
int n, q;
ll a[N]; ll dp[N][];
int mm[N];
void init(int n, ll b[])
{
mm[] = -;
for (int i = ; i <= n; ++i)
{
mm[i] = ((i & (i - )) == ) ? mm[i - ] + : mm[i - ];
dp[i][] = b[i];
}
for (int j = ; j <= mm[n]; ++j)
for (int i = ; i + ( << j) - <= n; ++i)
dp[i][j] = min(dp[i][j - ], dp[i + ( << (j - ))][j - ]);
} ll query(int l, int r)
{
int k = mm[r - l + ];
return min(dp[l][k], dp[r - ( << k) + ][k]);
} int main()
{
while (scanf("%d%d", &n, &q) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%lld", a + i); init(n, a);
ll v;
for (int i = , l, r; i <= q; ++i)
{
scanf("%lld%d%d", &v, &l, &r);
while (r - l >= )
{
int ql = l, qr = r, tar = -;
while (qr - ql >= )
{
int mid = (ql + qr) >> ;
if (query(ql, mid) <= v)
{
qr = mid - ;
tar = mid;
}
else
ql = mid + ;
}
if (tar == -) break;
v %= a[tar];
l = tar + ;
}
printf("%lld\n", v);
}
}
return ;
}
gym101201J Shopping 二分+RMQ+数学性质的更多相关文章
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...
- Internet 校验和的数学性质
Internet 校验和(Checksum)仅计算头部的正确性,这一点很重要,这意味着 IP 协议不检查 IPv4 packet 有效载荷部分的数据正确性.为了保证有效载荷部分的正常传输,其他协议必须 ...
- 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 ...
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]
题意Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80 ...
- 【BZOJ5083】普及 单调栈+二分+RMQ
[BZOJ5083]普及 Description 有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(从左到右或从右到左一个一个取出),使得 不管是从左往右还是从右往左取,都保证每时每刻 ...
- 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 ...
- 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 ...
- 【BZOJ3230】相似子串 后缀数组+二分+RMQ
[BZOJ3230]相似子串 Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出 ...
随机推荐
- SaeMail使用示例
SAE的官方文档:http://apidoc.sinaapp.com/sae/SaeMail.html SaeMail类的具体实现:http://apidoc.sinaapp.com/__fileso ...
- 766. Toeplitz Matrix斜对角矩阵
[抄题]: A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element. Now ...
- SHELL读取 ini 格式文件做配置文件
ini文件格式一般都是由节.键.值三部分组成 格式: [第一节 ] 第一个键 = 值 第二个键 = 第二个值 [第二节 ] 第一个键 = val1,val2,val3 例子: [COM] KINGGO ...
- pip指定安装包版本
pip是目前最好用的python包关系工具,没有之一. 1.版本范围符号:==.>=.<=.>.<. 2.单个安装示例: 1 2 3 pip install cchardet ...
- Oracle数据库管理
一.Oracle 的(资源限制)概要文件 为了控制系统资源的使用, 可以利用资源限制概要文件. 资源限制概要文件是 Oracle 安全策略的重要组成部分, 利用资源限制概要文件可以对数据库用户进行基本 ...
- Mybatis_映射文件配置
获取自增主键的值 若数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标 ...
- HUSTSE2017级5班3组小组JIRA软件使用体验看法汇总--未订正版
小组JIRA软件使用体验看法汇总 小黄 JIRA还是比较方便的,在项目组合管理阶段,可以让团队同时按时发布,也可以让计划变得更容易和快捷,可以跟踪团队的重要计划,清楚的了解项目的进度. 看了JIRA的 ...
- Highway Networks(高速路神经网络)
Rupesh Kumar Srivastava (邮箱:RUPESH@IDSIA.CH)Klaus Greff (邮箱:KLAUS@IDSIA.CH)J¨ urgen Schmidhuber (邮箱: ...
- HTML5 Canvas游戏开发实战 PDF扫描版
HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...
- web利用table表格生成excel格式问题
当我们把web页面上的table导成excel形式时,有时候我们的数据需要以特定的格式呈现出来,这时候我们就需要给指定的单元格添加一些样式规格信息. 文本:vnd.ms-excel.numberfor ...