CF1853
你谷的加题速度实在太慢了
被 CF 的题目薄纱
可以选任意次
首先判断原数列是否已经非排序。然后看每一个相邻位置
斐波那契式数列:
有多少个斐波那契式数列满足第
Hint: Can a sequence involving
, which is up to , really have up to terms?
其实,根据斐波那契数列的增长速度,根本到达不了
反向考虑。我们不是删除,而是在
记
考虑插入一些数回到前一天的状态,等回到第
在所有
注意我们并不在乎插入了什么数,只需统计每次在
然后在更新了
解释一下 CF 官方代码。
#include <bits/stdc++.h>
using namespace std;
int n, k, a[200010];
void solve() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
a[i] -= i; //是在a[i]-i位置插入,而非a[i]
}
if (a[0] != 1) { //特判
cout << 1 << "\n";
return;
}
a[n] = 2e9; //边界守卫
long long ans = 1; //答案
int inc = 1; //inc表示本次插入会在ans前插入多少个
while (inc < n) {
int days = (a[inc] - ans + inc - 1) / inc;
//插入1次不能让下一个a[i]-i排到ans前
//一次性加很多次,跳到下一个a[i]-i也排前,优化
if (days >= k){
//如果要下一个a[i]-i排前
//已经超过剩余插入次数,就结束
ans += k * inc;
//那还能插入(剩余次数)*(插入个数)个
k = 0;
break;
}
ans += days * inc;
//插入了(插入次数)*(多少个插入位置在ans前)
k -= days;//减少剩余插入次数
while (a[inc] <= ans) inc++;
//拓展在ans前的个数
}
ans += 1ll * k * n;
//1.上面没等到inc>=n就没有了剩余次数,k=0无影响
//2.inc=n出来的,剩下k次每次都插入n个
cout << ans << "\n";//输出
}
int main() {
ios::sync_with_stdio(0);
cin.tie(nullptr);
int t;
cin >> t;
while (t--)
solve();
}
定义长度
-
-
-
恰有
个位置 ,使 ,允许 .
现给定
提示:
。
每对里只能选一种。
设
所以“存在绝对值最大的
“
先判断是否存在绝对值最大,然后固定此位置为绝对值最大,就可以递归处理剩余没处理的数!!!
如果在某次递归中不存在绝对值最大,说明答案不存在。
但是每次循环找
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!