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. SQL——将两列合并成一列

    将两列合并连接成一列,需要注意的是列的格式必须是NVARCHAR或者VARCHAR类型 ), call_uuid, ) +','+agent_code '   PerDate 1 ,980408102 ...

  2. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  3. Java异常归纳

      1.使用Tomcat运行“播报哥架构”出现的两大异常 1.1 监听器异常 详细情况:部署好Maven项目,启动TOMCAT提示如下错误 java.lang.ClassNotFoundExcepti ...

  4. python_对字符串操作.join() 效率 比 + 效率高

    将列表中的字符拼接成字符串时,有两种方式 方式1:使用join()方法,将列表转为字符串 方式2:使用+运算符,循环遍历 import time str1 = ['a','b','c','d','e' ...

  5. k8s集群之master节点部署

    apiserver的部署 api-server的部署脚本 [root@mast-1 k8s]# cat apiserver.sh #!/bin/bash MASTER_ADDRESS=$1 主节点IP ...

  6. CAD交互绘制带颜色宽度的直线(网页版)

    用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...

  7. Java数据结构和算法(二)--队列

    上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...

  8. ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

    最近在看iBatis时,想做用动态Sql做个分布.因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能.所以要对生成后的代码做修改.我在Java高手真经的一书中看到有做了MySq ...

  9. 【讲●解】KMP算法

    KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...

  10. html/css:简单网页

    html: <!DOCTYPE html> <html> <head> <meta http-equiv=“content-type” content=“te ...