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. IOS文件下载

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, ...

  2. # Transition:添加弹出过渡效果

    # Transition:添加弹出过渡效果 通过鼠标的单击.获得焦点,被点击或对元素任何改变中触发,并平滑地以动画效果改变CSS的属性值. W3C-transition MDN-transition ...

  3. 如何通过Java代码判断当前的环境是否支持JRE 9

    JDK9已经出来有一段时间了,因此很多流行的Java应用纷纷增添了对JDK9乃至JDK10的支持,比如Tomcat. 我们通过这个链接下载最新的Tomcat源文件包,总共7MB: https://to ...

  4. Unity复杂的旋转-欧拉角和四元数

    一.欧拉角欧拉角最容易表示,用三个变量X,Y,Z可以直观的表示绕着某个轴的旋转角度. 在Unity里就是Transform组件的Rotation里的X Y Z三个变量代表了欧拉角 二.四元数四元数相比 ...

  5. 20道必须掌握的C++面试题

    20道必须掌握的C++面试题 在面试C++方面的工作时,经常会遇到各种面试题,这对应聘人员的知识掌握能力要求较高.本文将为大家带来的就是20道必须掌握的C++面试题,不要错过哦! 问1:请用简单的语言 ...

  6. HTML习题附答案

    第一章 1.HTML指的是(   A   ). A超文本标记语言(Hyper Text Markup Language) B家庭工具标记语言(Home Tool Markup Language) C超 ...

  7. Maven项目框架源代码和文档的查看

    方便maven项目的调试和源代码学习,可以通过添加maven插件的方式下载源代码和文件进行查看. mavan插件节点结构如下: <project xmlns="http://maven ...

  8. Maven实战读书笔记(六):Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...

  9. android开发链接

    http://blog.csdn.net/zz2043191420/article/details/47338591

  10. npm的替代品

    npm安装依赖包太慢,cnpm也快不到哪里去,偶然发现了yarn,特快特好用! 安装yarn:npm install -g yarn 查看版本号:yarn -v 安装依赖项:yarn install