雅礼集训 Day1 T1 养花
养花
题目描述
小\(C\)在家种了\(n\)盆花,每盆花有一个艳丽度\(a_i\).
在接下来的\(m\)天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅, 并在晚上放回. 同时每天有特定的光照强度\(k_i\), 如果这一天里摆放在客厅的花艳丽度为\(x\), 则他能获得的喜悦度为\(x\ \mathrm{mod}\ k_i\).
他希望知道, 每一天他能获得的最大喜悦度是多少.
输出输出格式
输入格式
数据第一行包含两个正整数\(n,m\).
接下来一行\(n\)个正整数, 第\(i\)个数\(a_i\)表示第\(i\)盆花的艳丽度.
接下来\(m\)行, 每行三个正整数\(l_i,r_i,k_i\), 表示选花区间和光照强度.
输出格式
输出\(m\)行, 每行一个整数, 表示最大喜悦度.
说明
对于\(20\%\)的数据,\(n,m\le 4000\).
对于\(40\%\)的数据,\(n,m\le 50000\).
对于另外\(20\%\)的数据,\(a_i\le 300\).
对于\(100\%\)的数据,\(n,m,a_i,k_i\le 10^5\).
区间询问 \(a_i \ mod \ k\) 的最大值
如果分块搞得熟估计可以A掉吧,或者主席树敢瞎写之类的
最开始想到一个垃圾的\(nlogn\sqrt n\)做法
思路是\(k \le \sqrt n\)预处理线段树套分块,然后\(logn\)查询
\(k > \sqrt n\)时暴力在主席树上找,单次\(\sqrt n logn\)
40pts 都拿不到
正解的做法是分块,对位置的分块
设块大小为\(S\),每个块预处理出模所有\(k\)时的最值
处理的技巧其实有点神奇,\(f[i]\)表示当前块\(i\)这个值的位置前面一个值是多少
然后枚举\(k\),枚举每个区间,用\(f[i]\)更新
对每个块的复杂度是\(\sum_{i=1}^n \frac{n}{i}\)
发现是调和级数,则为\(nlnn\)
总复杂度:\(O(n^2lnn/s+ms)\)
取\(S=\sqrt{nlnn}\),得到复杂度\(O(n\sqrt{nlnn})\)
事实上上界比较满,常数也不小,你谷最慢点跑了1.5s(雅礼只开了1s,跑的真快emm
Code:
#include <cstdio>
#include <cstring>
const int N=1e5;
const int S=1e3;
const int M=1e2;
int mx[M+2][N+10],n,m,a[N+10],f[N+10];
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",a+i);
int num=(n-1)/S;
for(int i=0;i<=num;i++)
{
memset(f,0,sizeof(f));
int l=i*S+1,r=min(n,(i+1)*S);
for(int j=l;j<=r;j++) f[a[j]]=a[j];
for(int j=1;j<=N;j++) f[j]=max(f[j-1],f[j]);
for(int j=1;j<=N;j++)
for(int k=0;k<=N;k+=j) mx[i][j]=max(mx[i][j],f[min(k+j-1,N)]-k);
}
for(int l,r,k,i=1;i<=m;i++)
{
int ans=0;
scanf("%d%d%d",&l,&r,&k);
int ll=(l-1)/S,rr=(r-1)/S;
for(int j=ll+1;j<rr;j++) ans=max(ans,mx[j][k]);
for(int j=l;j<=min(r,(ll+1)*S);j++) ans=max(ans,a[j]%k);
for(int j=max(l,rr*S+1);j<=r;j++) ans=max(ans,a[j]%k);
printf("%d\n",ans);
}
return 0;
}
2018.10.1
雅礼集训 Day1 T1 养花的更多相关文章
- 【2017-10-1】雅礼集训day1
今天的题是ysy的,ysy好呆萌啊. A: 就是把一个点的两个坐标看成差分一样的东西,以此作为区间端点,然后如果点有边->区间没有交. B: cf原题啊.....均摊分析,简单的那种. 线段树随 ...
- 雅礼集训 Day1 T3 画作 解题报告
画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...
- 雅礼集训 Day7 T1 Equation 解题报告
Reverse 题目背景 小\(\text{G}\)有一个长度为\(n\)的\(01\)串\(T\),其中只有\(T_S=1\),其余位置都是\(0\).现在小\(\text{G}\)可以进行若干次以 ...
- 雅礼集训 Day6 T1 Merchant 解题报告
Merchant 题目描述 有\(n\)个物品,第\(i\)个物品有两个属性\(k_i,b_i\),表示它在时刻\(x\)的价值为\(k_i\times x+b_i\). 当前处于时刻\(0\),你可 ...
- 雅礼集训 Day1 T2 折射
折射 题目描述 小\(\mathrm{Y}\)十分喜爱光学相关的问题,一天他正在研究折射. 他在平面上放置了\(n\)个折射装置,希望利用这些装置画出美丽的折线. 折线将从某个装置出发,并且在经过一处 ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- [LOJ 6031]「雅礼集训 2017 Day1」字符串
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
- [LOJ 6030]「雅礼集训 2017 Day1」矩阵
[LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...
- [LOJ 6029]「雅礼集训 2017 Day1」市场
[LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...
随机推荐
- C#基础学习笔记(个人整理)
学习笔记 第一章:c#基础 一.程序设计语言的发展及历史 1.程序设计语言? 通俗也叫编程语言,实现人与机器交互的工具 2.历史 1)机器语言 : 0,1 2)汇编语言 : 包含一些机器语言,同时增加 ...
- C++基础 namespace register bool
1. namespace (1)命令空间 C中的命名空间 在C中只有一个全局作用域 C语言中所有全局标识符共享同一个作用域 标识符之间可能发生冲突 C++中提出了命名空间的概念 命令空间将全局作用域分 ...
- P2567 [SCOI2010]幸运数字 DFS+容斥定理
P2567 [SCOI2010]幸运数字 题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,66 ...
- 30-RoutingMiddleware介绍以及MVC引入
1-构建路由 public class Startup { // This method gets called by the runtime. Use this method to add serv ...
- Python文章推荐1
Table of Contents 1. 分享最近看到的python相关的几篇好文(我只是想偷懒) 1.1. 形象解释了什么是GIL 1.2. 知乎上 Pythonic 相关 1.3. evil &q ...
- Java从后台重定向(redirect)到另一个项目的方法
(1)通过ModelAndView跳转 @RequestMapping("alipayforward") public ModelAndView alipayforward(Htt ...
- Android学习笔记(一)之仿正点闹钟时间齿轮滑动的效果
看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家.我研究的这 ...
- how to export chrome speed dial extension?
locate chrome-extension_dgpdioedihjhncjafcpgbbjdpbbkikmi_0.localstorage, copy it to you want, everyt ...
- Git上手:Git扫盲区
Git 自述Git 是由伟大的电脑程序员Linus Torvalds编写的一个开源的,分布式的版本控制系统软件. Git 核心原理Git 利用底层数据结构,通过指向索引对象的可变指针,保存文件快照. ...
- JMeter学习笔记(三) 录制脚本
jmeter测试脚本,可以通过其他工具进行录制,例如 BadBoy,我之前使用过此工具,安装以及使用都比较简单的,大家可以在网上搜索一下. 在此整理一下jmeter自带的录制功能,进行录制脚本. 1. ...