5177: [Jsoi2013]贪心的导游


Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 32  Solved: 15
[Submit][Status][Discuss]

Description


南京有一条著名的购物街。购物街嘛,就是一排整齐的商店啦~
导游小Z每次都会把游客团带到购物街里走一段,然后选择一个商店进去购物。小Z接待的游客都是购物狂,他们恨
不得将店内的商品洗劫一空,也就是说,只要他们能买,就一定会继续买(钱够不够你不用考虑,他们都有信用卡
可以透支)。但是有一点,他们都非常讲究平等、很谦虚,每个人都不能忍受比别人多买什么东西或者少买什么东
西,于是他们每个人最后买的商品数量都是一样的。这虽然导致他们没办法每次都把商店搬空,但是每次已经给店
家带来一大笔生意了,店家已经非常感谢了!为了表示感谢,店家决定把游客们买完之后剩下来那几件没卖掉的商
品就送给导游小Z了。贪心的小Z自然希望自己能获赠的商品数量越大越好啦~现在告诉你这一排共n个商店(标号为
0到n-1)每个商店里的商品总数,每次小Z会带一批共p个游客的旅游团,到其中u号商店和v号商店之间逛一逛,请
你帮小Z在所逛的商店区间内选择一个,告诉小Z他最多能获赠多少件商品。

Input


第一行,包含两个整数n、m,分别表示商店个数、小Z带来的旅游团个数。
接下来一行,包含n个整数ai(i=0,1,……,n-1),表示第i个商店的商品总数。
接下来m行,每行三个整数u、v、p(0≤u,v≤n-1,2≤p≤1000)
表示这个旅游团逛u号商店和v号商店之间的商店(包含u、v),且这个旅游团的人数为p。
n≤1000000, m≤50000, 0≤ai≤1000, 2≤p≤1000

Output


共输出m行,每行一个整数,第i行输出第i个旅游团购物后,小Z最多能获赠的商品数量。

Sample Input



Sample Output



第一个旅游团, 2 个人, 0 号商店到 1 号商店的区间。若去 1 号商店,共 2 件商品,每人买 1 件,剩 0 件
。若去 2 号商店,共 4 件商品,每人买 2 件,剩 0 件。所以,小 Z 最多获赠 0 件。
第二个旅游团, 3 个人,小 Z 选择带他们去 4 号商店,共 8 件商品,每人买 2 件商品(因为每人 3 件不够)
,剩下 2 件,小 Z 最多获赠就是 2 件。 可以验证去其它商店小 Z 最多获赠的商品不会达到 2 件。

HINT


分析:


建出主席树后暴力查找[i * p,(i + 1) * p)里面最大值就好,

最坏一次查询i会枚举500次

最坏复杂度O(500n*logn)

总时限40s随便跑把,数据也水

AC代码:


# include <iostream>
# include <cstdio>
using namespace std;
const int N = 1e6 + ;
int rt[N],lc[N * ],rc[N * ],s[N * ],dt,n,m,a[N],mx;
void build(int &k,int l,int r)
{
k = ++dt;
if(l == r)return;
int mid = l + r >> ;
build(lc[k],l,mid);
build(rc[k],mid + ,r);
}
void updata(int &k,int pre,int L,int l,int r)
{
k = ++dt;s[k] = s[pre] + ;
if(l == r)return;
lc[k] = lc[pre];rc[k] = rc[pre];
int mid = l + r >> ;
if(L <= mid)updata(lc[k],lc[pre],L,l,mid);
else updata(rc[k],rc[pre],L,mid + ,r);
}
int Query(int k,int pre,int L,int R,int l,int r)
{
if(s[k] - s[pre] == )return ;
if(l == r)return l;
int mid = l + r >> ;
if(L > mid)return Query(rc[k],rc[pre],L,R,mid + ,r);
if(R <= mid)return Query(lc[k],lc[pre],L,R,l,mid);
int ret = Query(rc[k],rc[pre],L,R,mid + ,r);
if(!ret)ret = Query(lc[k],lc[pre],L,R,l,mid);
return ret;
}
int main()
{
scanf("%d %d",&n,&m);int x,y,p,ret;
for(int i = ;i <= n;i++)scanf("%d",&a[i]),mx = max(a[i],mx);
build(rt[],,mx);
for(int i = ;i <= n;i++)updata(rt[i],rt[i - ],a[i],,mx);
while(m--)
{
scanf("%d %d %d",&x,&y,&p);y++;ret = ;
for(int i = ;i <= mx;i += p)
ret = max(ret,Query(rt[y],rt[x],i,min(i + p - ,mx),,mx) % p);
printf("%d\n",ret);
}
}

[Bzoj5177][Jsoi2013]贪心的导游(主席树)的更多相关文章

  1. BZOJ5177 : [Jsoi2013]贪心的导游

    首先预处理出对于每个模数,所有被模数按结果从大到小排序的结果,那么对于一个询问,如果可以在$O(1)$时间内判断某个数字是否出现,则可以$O(1000)$回答. 考虑对序列进行分治,对于区间$[l,r ...

  2. 【bzoj5177】[Jsoi2013]贪心的导游(分块)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5177 在网上看到的题解基本都是用主席树,也就是带点骚操作的暴力直接艹过去的.这里分享一 ...

  3. 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)

    [BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...

  4. [BZOJ4571][SCOI2016]美味(贪心+主席树)

    经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio& ...

  5. BZOJ4571: [Scoi2016]美味【主席树】【贪心】

    Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 ...

  6. Governing sand(主席树/贪心)(2019牛客暑期多校训练营(第七场))

    示例:输入:25 1 11 10 125 1 23 2 3输出:12 题意:n种树,第i种树有P[i]颗,砍掉每颗树的代价是C[i], 高度是H[i].需要用最小的花费砍掉一些树,让最高的树超过一半. ...

  7. P3293 [SCOI2016]美味 主席树+按位贪心

    给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ...

  8. [SCOI2016]美味——主席树+按位贪心

    原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ...

  9. 「JSOI2013」贪心的导游

    「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...

随机推荐

  1. Angular JS中变量定义的基本原则

    在Angular JS开发中,经常需要定义一些变量,关于这些变量的定义方法及作用域应该注意以下几点: 1. 如果能用局部变量解决问题,尽量不要用全局变量. 2. 需要与界面双向绑定的变量采用$scop ...

  2. Python Linked List

    上周日教导一个科班非技术的朋友学习 Python 编程.他的 Python 水平大概就是看了几篇短的 Python 介绍博客.会流程控制和全局函数编写. 具体教导思路是从自己实现一个链表出发,研究学习 ...

  3. java 面试题整理

    java面试题 1.接口和抽象类的区别 抽象类 接口 抽象类中可以有默认方法 在java8之前,不能有默认方法 extends implements 抽象类中可以有构造器 接口中不能有构造器 抽象类中 ...

  4. .NET多线程总结

    1.不需要传递参数,也不需要返回参数 我们知道启动一个线程最直观的办法是使用Thread类,具体步骤如下: public void test() { ThreadStart threadStart = ...

  5. Xgboost集成算法

    集成算法思想: Xgboost基本原理: Xboost中是一个树(函数)接着一个树(函数)往里加,每加一个树都希望整体表达效果更好一些,即:目标函数逐步减小. 每加入一个函数,使目标函数逐渐减小,整体 ...

  6. python关于入参中,传入的是指针还是引用

    偶然看到别人的代码,发现有的会传入参数之后,做一次copy,试验一下,关于入参中,传入的是指针还是引用先说自己的结论:1.如果传入的是简单的类型,那么传入应该是引用的数值,2.假如传入的是df这种类型 ...

  7. strong&weak

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...

  8. Ext 6.5.3 classic版本,自定义实现togglefield开关控件

    1,在Ext 6.5.3的classic版中没有提供开关控件,参照modern版中 togglefield开关的实现,继承滑动器(sliderfield),自定义一个开关按钮.支持value绑定和点击 ...

  9. image的resizeMode属性

    Image组件必须在样式中声明图片的宽和高.如果没有声明,则图片将不会被呈现在界面上.    我们一般将Image定义的宽和高乘以当前运行环境的像素密度称为Image的实际宽高. 当Image的实际宽 ...

  10. POJ-2442-Sequence(二叉堆)

    POJ-2442 Description Given m sequences, each contains n non-negative integer. Now we may select one ...