第二周记
前言:
10.20
今天体测跑了一公里,拿下了三分三十的成绩,有时感觉自己当时走体育会不会比现在混得好()
下午心理课颓废整场,其实越学就越想学(至少对于我是这样),主要我现在真不知道怎么学,没有老师带领,做题像大海捞针,做题也不发答案,也不知道是我的问题还是学校的问题,tnd高中也是被折磨成斯德哥尔摩了。
听说导员当年四级裸考过线(高考英语118),感觉又有点放松了,但是心里还是毛毛的。
不会高数。不会高数。不会高数。不会高数。不会高数。不会高数。不会高数。
晚上终于更新了“快速平方根取倒数算法”。还是很震撼的,这个算法刷新了我对“卡常”的认知:之前总是把常数优化和算法优化区别来看,觉得“卡常”是相当不优雅的行为,实际上充分调用“计算机”的所有资源本身就是一种艺术,内核级的优化绝对不是几个常规操作就能解决的。
再说一点:虽然上文为“卡常”“正名”,但是在高级语言中不要老是觉得“卡常”有多万能,别想着直接加个循环展开就能 \(n^2\) 过百万,写编译器的一定比你更懂优化。
有用的“卡常”也就是快读快输,递归改迭代,数组模拟这些吧,当然还有指令集之后可能会学一下?比如这位大佬就很厉害。
淦,键盘没电了,睡觉睡觉。
10.21
晚上的自习取消了,挺好的,但是好困。
那个科创项目也不知道怎么整,周三就交了。
接下来几天也许会复习一些数论吧,说是复习实则预习。
前两天 \(cyl\) 总是问一些很简单数位 \(DP\) 的题目,一开始我只想着用板子混过去,还想着他们学校怎么会给初学者安排这种题,结果 \(AI\) 给出了空间复杂度为 \(\Theta(1)\) 的方法,让我明白我又一次囿于原来只学算法那一套了,数位 \(DP\) 与其说是一种算法不如说是一种思想,实现它的方式多种多样,何必困于记搜那一套?因此这一次系统的学习一下数位 \(DP\) 。
10.22
下午休息,买的零食回来了,开心!!!
10.23
计算机课真的很水,为什么我没有前两名手速快,为社么我要纠结于入门题的手速,为什么他俩要卷手速,为什么换个键盘我就打不快......少年望眼欲穿终不可得,郁郁而不得的,原来不过“人先”二字......
无能之辈啊,无为亦是无畏。
加加油,给给力啊!!!
10.24
作业很多md
今天晚上休息呢,总算是搞好了立项,\(PSO\) 这种算法应该算相当合适了,这种鸡毛蒜皮的小事可真多,最后还是个 \(5min\) 线上答辩,真无聊,也没学着啥真东西。
明天一定要把工数群里的 \(PPT\) 好好地看一遍,我发誓明天要把极限的笔记补全了!!!
今晚的任务:洗澡,换洗衣服,换床单,收拾床铺,把 \(C\) 题补了,把异或算贡献补了,十点上床。
再说一遍:某个网站的排名没有任何效力!你最好别被任何错误的人影响。除去自己以外全为浮云而已。
10.25
八点半起床,爽~
学习笔记:
2025年广东工业大学程序设计竞赛月赛(同步赛)
新生赛还是很简单的,但是不习惯 \(ICPC\) 赛制,把被绊住的改一改。
Problem.J 最不上升也不下降序列
根据样例可以猜出构造方法,以 \(\sqrt{n}\) 为块长构造一系列分开的块,每个块中为连续的单调性相同的子串,这里主要是写一下证明:
定理:对于任意长度为 \(mn+1\) 的排列 \(p\),要么必然存在一个长度为 \(m+1\) 的递增子序列,要么必然存在一个长度为 \(n+1\) 的递减子序列。
证明:设 \(f(i)\) 为以 \(p_i\) 结尾的 \(LIS\) 长度。
- 若 \(f(i)\ge m+1\) 则定理成立。
- 若 \(f(i)\le m\),则 \(f(i)\) 的值只能为 \(1\) 到 \(m\) 的某一个整数,由于鸽巢原理,可知必然有一正整数 \(k\) 被 \(f(i)\) 至少取了 \(n+1\) 次。即 \(f(i_1)=f(i_2)=\cdots=f(i_n)=f(i_{n+1})=k\),再由 \(f(i)\) 定义可知,\(p_1>p_2>\cdots>p_n\),即排列中含有长度至少为 \(n+1\) 的 \(LDS\)。
不妨假设 \(f(i)\le m\),设 \(f(i)\) 最大上界为 \(M(M\le m)\),由上述定理进一步推导得:
故而:
然后即可模仿样例中的方法进行构造以取到 \(2\sqrt{n}\) 这个答案。
#include<bits/stdc++.h>
using namespace std;
int n,bestK=1;
signed main(){
if(!(cin>>n)) return 0;
int bestVal=(int)1e18;
for(int k=1;k*k<=n;++k){
int val=k+(n+k-1)/k;
if(val<bestVal){
bestVal=val;
bestK=k;
}
int k2=(n+k-1)/k;
int val2=k2+(n+k2-1)/k2;
if(val2<bestVal){
bestVal=val2;
bestK=k2;
}
}
vector<int> perm;
for(int i=1;i<=n;i+=bestK){
int end=min(n,i+bestK-1);
for(int x=end;x>=i;--x) perm.push_back((int)x);
}
for(size_t i=0;i<perm.size();++i){
if(i) cout<<' ';
cout<<perm[i];
}
return 0;
}
Problem.M 缩花
诈骗,第一任意选择根节点,再选择一个非叶子节点进行操作即可,至于操作数,我们发现每次操作至多让一个非叶子节点变成叶子节点,那么直接 \(\Theta(n)\) 统计非叶子节点即可,不贴代码了。
Problem.C 雪莉的预言
经典的带修改第 \(k\) 大,但是单次二分加数据结构显然不足以通过此题,因此我们只能从特殊性质入手寻求单次 \(\Theta(1)\) 复杂度。

浙公网安备 33010602011771号