LOJ#538. 「LibreOJ NOIP Round #1」数列递推
description
- sosusosu 虐爆 OI 之后成为了一名文化课选手。一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式:
给定一个下标从000开始,无限长的整数列ai{a_{i}}ai,i∈Ni \in Ni∈N ,已知a0,a1a_{0},a_{1}a0,a1 的值,以及递推式ai+2=kai+1+aia_{i+2}=ka_{i+1}+a_{i}ai+2=kai+1+ai,i∈Ni \in Ni∈N ,k∈N+k \in N^+k∈N+。
- sosusosu 研究了这些数列,发现它们十分优美充满人类智慧,于是决定出一道 OI 题。
- sosusosu 给了你一个集合 S⊂NS\subset NS⊂N,他想问你对于SSS中的每个数sis_isi,使得asia_{s_{i}}asi最大的sis_{i}si使得asia_{s_{i}}asi最小的sis_{i}si分别是多少。如果这样的sis_{i}si有多个,请你回答最小的一个。
- 另外,sosusosu 准备对他作业中碰到的每个数列都让你回答一次,不过每次的集合SSS是一样的。
- 数列数量n≤3∗105n\le3*10^5n≤3∗105,SSS中的元素个数m≤105m\le 10^5m≤105
solution
- 手玩几组样例,可以得到一个结论:序列在经过某一个临界点之后会变成单调递增或单调递减,且最多只有前log2klog_2{k}log2k个数是不单调的,请读者自证我太菜了不会证明
- 故暴力判断前log2klog_2{k}log2k个数,然后根据序列的单调性判断SSS中最大的一个数是最大值还是最小值即可
- 注意如果前log2klog_2{k}log2k个数中没有任何一个在SSS中,那么答案就会是S1S_1S1,需要特判
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f;
}
const int N=3e5+10;
const int M=1e5+10;
int m,n,s[M],w[M];
ll a[N];
int main(){// freopen("ex_seq4.in","r",stdin);m=read();for(int i=1;i<=m;++i){s[i]=read();}n=read();while(n--){a[0]=read();a[1]=read();int k=read();int fi=min(100,s[m]);ll mx=-1e16,mn=1e16;int mxp=-1,mnp=-1;for(int i=2;i<=fi;++i){a[i]=1ll*k*a[i-1]+a[i-2];if(a[i]>1e15&&a[i-1]>=0&&a[i-2]>=0&&a[i]>=0){fi=i;break;}if(a[i]<-1e15&&a[i-1]<=0&&a[i-2]<=0&&a[i]<=0){fi=i;break;}}for(int i=1;i<=m;++i){if(s[i]<fi){if(a[s[i]]>mx) mx=a[s[i]],mxp=s[i];if(a[s[i]]<mn) mn=a[s[i]],mnp=s[i];}else break;}if(a[fi]>mx&&a[fi]>0)mxp=s[m];if(a[fi]<mn&&a[fi]<0)mnp=s[m];if(mxp==-1)mxp=s[1];if(mnp==-1)mnp=s[1];printf("%d %d\n",mxp,mnp);}return 0;
LOJ#538. 「LibreOJ NOIP Round #1」数列递推相关推荐
- LOJ#539. 「LibreOJ NOIP Round #1」旅游路线
n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...
- 「LibreOJ NOIP Round #1」旅游路线
「LibreOJ NOIP Round #1」旅游路线 题目链接 做法: 首先肯定要预处理些东西,来使单词询问达到\(o(logn)\)或者\(o(1)\)的复杂度,又因为距离这个东西的范围太大,我们 ...
- LOJ #510. 「LibreOJ NOI Round #1」北校门外的回忆(倍增+动态开点线段树)
题目 这个题是一个精彩的分析性质区间离散的问题 真的详细 维护链真的一绝. LOJ\rm LOJLOJ最短ACCode\rm AC \ CodeAC Code #include<bits/std ...
- 【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤
[题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求 ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树
$f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并) 我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初 ...
- LibreOJ NOIP Round #1」七曜圣贤
B. 七曜圣贤 内存限制:1024 MiB时间限制:2500 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 本题 C/C++ 时限 2.5 秒,Pascal 时限 5 秒.最后将改时限 ...
- 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)
description 戳我看题目哦 solution 有一道非常相似的题目 一棵树,每条边限制两个端点的大小关系(限制 a[u]>a[v]a[u]>a[v]a[u]>a[v] 或 ...
- 【LOJ574】「LibreOJ NOI Round #2」黄金矿工
[题目链接] 点击打开链接 [思路要点] 可参考 官方题解 . 以下为笔者个人的见解,方便起见,下称矿工为老鼠,金矿为洞. 我们可以对洞的权值加上深度,老鼠的权值减去深度,从而不需要考虑树的边权. 考 ...
最新文章
- 我的angularjs源码学习之旅2——依赖注入
- linux子系统gdp调试,Linux系统中GDB功能汇总
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
- PHP中的ob_start用法详解
- Matlab遗传算法TSP求解
- uni-app框架介绍
- 川师c语言实验报告9,川师c语言实验报告十.doc
- VC 整人程序 修改分区表
- onhashchange事件--司徒正美
- Python函数必须先定义、后调用(函数调用函数例外)
- Python使用string.Formatter()制作打印模板
- xp下格式化linux分区的硬盘,Windows XP 下格式化和清理磁盘(转)
- Qt利用avilib实现录屏功能_利用CE修改LOL实现各种功能(无限视距、锁定视距、攻击距离、炮塔范围、人物大小等)...
- Vue / axios / props 调用后端接口数据并渲染到页面
- python文本文件对比_Python-文件差异对比
- java i18n utf_struts2.0乱码 在struts.xml里面设置struts.i18n.encoding=utf-8依然出现乱码是怎么回事呀...
- Disk Diet for mac (好用的磁盘清理软件)
- HCNP-RS培训视频课程[简讲版]-马青-专题视频课程
- 蓝牙的基本概念以及发展轨迹 - 蓝牙的前生后世
- 0.96寸OLED显示图片