雅礼集训 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 ...
随机推荐
- Logger日志配置级别说明及设置方法、说明
日志记录器(Logger)是日志处理的核心组件.log4j具有5种正常级别(Level).日志记录器(Logger)的可用级别Level (不包括自定义级别 Level), 以下内容就是摘自log4j ...
- gd库 给底图写入文字问题
png-8的图片 设置颜色会返回false,换成png-24的就可以了
- scrapy--json(360美图)
之前开始学习scrapy,接触了AJax异步加载.一直没放到自己博客,趁现在不忙,也准备为下一个爬虫做知识储存,就分享给大家. 还是从爬取图片开始,先上图给大家看看成果,QAQ. 一.图片加载的方法 ...
- tcl之正则表达式
- PHP无限分类生成树方法,非递归,引用
//这个是核心方法 function generateTree($items){ $tree = array(); foreach($items as $item){ ...
- Social Media Addiction【社交媒体上瘾】
Social Media Addiction Children as young as ten are becoming dependent on social media for their sen ...
- ZOJ3640 概率DP
Background If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at ...
- https://www.cnblogs.com/gaoxiang12/p/3695962.html
https://www.cnblogs.com/gaoxiang12/p/3695962.html
- Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)
传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...
- ABAP 7.51 構文書き方変換について
便利になったなぁと感じたコマンドのメモです.NetWeaver7.40 SP2から使えます. SAP NetWeaver AS for ABAP 7.51 Innovation Package – O ...