2023.2.25
不会登 qq,不会安装虚拟机,捣鼓了一个小时,差评。
今天打了模拟赛,其实是开心的一天,赛前的状态比较好,很有信心。T1 一眼 dp,先用暴力写了个部分分,然后思考了亿下,然后修改了一下时间复杂度,其实类似于重新做了一遍。大概想了 15min 就有思路辣,然后就写出来了,自己看了一下感觉能过,心里很高兴,然后看了眼 T2、T3 直接放弃,开摆!其实心里是有底的,感觉能过,排名应该会很靠前,所以提前就开始高兴力。
结果在结束前 8min 又加了 30min,难熬。差评。然后出结果。果然不出所料,切掉了 T1,大概并列 rank 2 吧因为几个大佬没参加。总之开心,不垫底了。
另外切掉 T1 的两位是用 STL + 二分做的,他们坚信我的复杂度假了,认为是数据太水没卡掉我捏。但是我坚持认为我是正解()。
qwq
总之是开心的一天!虽然没做作业,数学一团糟,但是被夸了!开心!不 emo 了!
浅浅写一下题解吧。
T1.小白的序列(这个好似没有原。)
简述题意:序列 a 中,找出一段连续的区间 [L, R],满足该区间中有一个数 x 可以整除 [L,R] 中的任意一个数。输出序列最长区间的个数和长度(注意这里长度是指 R - L 而非 R - L + 1)。
6
额,当我开始想正解的时候,思路清晰 but 又混乱,不嫌弃的话可以看一眼我这个最开始的草稿。但是就这么推出来了。
稍微整理了一下,认真的再写一下解题思路和总结。
#include<bits/stdc++.h>
using namespace std;
const int N=300010;
int n;
int a[N];
int f[N], sum[N];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
f[0] = a[1];
for(int i = 1; i <= n; i ++ )
{
if(a[i] % f[i - 1] == 0)
{
sum[i] = sum[i - 1] + 1;
f[i] = f[i - 1];
continue;
}
for(int j = i; j >= q; j -- )
{
if(a[j] % a[i] == 0)
{
f[i] = a[i];
sum[i] ++;
}
else break;
}
}
int ans = 0, tot = 0;
for(int i = 1; i <= n; i ++ ) ans = max(ans, sum[i]);
for(int i = 1; i <= n; i ++ )
{
if(sum[i] == ans) tot ++;
}
printf("%d %d\n", tot, ans - 1);
for(int i = 1; i <= n; i ++ )
{
if(sum[i] == ans) printf("%d ", i - ans + 1);
}
return 0;
}
剩下的 1h 焦虑的看着 T2 和 T3 并抱着杯子看似喝水的摸鱼,焦虑而开心的看着 T1 思考能否优化并且盯着时间。等待漫长但是已经感觉十拿九稳了。开心。n^2 总比 n^3好捏。
痛苦的一周没有白费。有进步。总结是希望在每一场模拟赛中都能像今天这样,认真对待,当正式比赛,沉浸在题里,不会的问题就没有那么困难啦。一定要认真对待,平时的练习认真总结w。100 pts 对我来说像个瓶颈,因为做完第一题时总感觉是对的,然后就直接放弃后面的题了,甚至没看题,没留给后面的题时间。习惯于只提交一题,这样不好。希望以后能改正,完成 T1 后至少留 1h 去打一下后面的题的暴力,甚至有必要最初就认真通读题面,毕竟有的比赛难度也不是递增捏。
加油。