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 输出 ...
随机推荐
- zend studio 字体大小修改,默认编码设置
zend studio的字体感觉很小,很多用户不是很适应,修改方法如下: 第一步:进入设置窗口 windows -> preferences 第二步:进入修改字体的选项卡. Gene ...
- opennebula image单个实例响应数据格式
{ ", ", ", "TEMPLATE": { "DEV_PREFIX": "hd", " }, ...
- php抓取网页中的内容
以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...
- LightOJ 1282 Leading and Trailing (数学)
题意:求 n^k 的前三位和后三位. 析:后三位,很简单就是快速幂,然后取模1000,注意要补0不全的话,对于前三位,先取10的对数,然后整数部分就是10000....,不用要,只要小数部分就好,然后 ...
- Java 数据结构之数组
public class Arrays { //创建一个Integer空数组 public static Integer[] player=null; //添加球员号码 pri ...
- 很棒的git和python学习网站
很棒的git和python学习网站:http://www.liaoxuefeng.com/ 博主名叫廖雪峰
- 原型(Prototype)模式
一. 原型(Prototype)模式 原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象. 从孙大圣的手段谈起 孙悟空在与黄风怪的战斗中 ...
- duilib入门简明教程 -- 响应按钮事件(4)
上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI; 也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍 ...
- C# 接口(2)
接口的实现方式. 接口的实现分两种: 1 显示实现接口 2 实现接口. 我们前面所得的接口的实现均为实现接口.也就是第二种方式.那么我们来来看第第一种实现方式: interface IHuman { ...
- 生成HTML测试报告
HTMLTestRunner是Python标准库unittest单元测试框架的一个扩展,可以生成易于使用的HTML测试报告,这个扩展很简单,只有一个HTMLTestRunner.py,下载地址:htt ...