noip前的记录
9.26
今天打的比赛一道题也没做出来,但好像大家都考得不是很好,所以也没挨吵。考试的时候窗外运动会的声音很大,一开始还觉得有些有趣,但后来发现自己没有办法专注思考题目后就很讨厌。第一题用了一个糊的做法拿了80分,被离散化卡了,不然我这个糊做法说不定能满分(。第二题一开始想的是DP,但是想的是每加一段所能造成的贡献,后来细想,发现可以用dfs的形式实现比较容易,可这样时间和空间复杂度就会爆炸,但最后没想出来正解,也没拿满60分部分分,小寄。第三题一开始的思路也是DP,然后理所应当地想到了Floyd,但是没发现这种做法连第一个点都过不了,特殊点性质也没推出来,大寄。第四题考试的时候以为点分治,没写,考完后才发现竟然有30分的送分,大寄。考点是树链剖分,晚上的时候,也就是刚刚,又打了一遍线段树和重链剖分的模板。
晚上的时候cy用了1个多小时的时间给我们分析比赛策略,但其实我不是很想听,因为我考试的时候感觉最严重的不是策略的问题,而是感觉到自己知识的匮乏,以及对数据结构的不熟练,思路的局限性。这也是我接下来一个多月时间里的主要目标。或许可以训练一下自己的一心二用能力,就像cy所说的那样,边打无脑代码边思考。
9.27
今天考得很差,第一题想正解想了很久,因为可以很容易地得到满足gcd至少为G的和lcm至多为L的集合,所以以为是类似于广义容斥那种反演的做法,可是后来发现反演得到的结果是错的,之后又想了想可以分解质因数后把指数随意组合,但这样又会有不合法的,很难搞,其实也想了用状压,但方向错了,最后连分都没骗全,只得了可怜的5分。第二题看到划分数时其实内心有一点害怕,因为之前做过一道很简单的划分数的题,但没做出来,于是有了一种害怕做这题的心理暗示,虽然最后还是尝试写了DP方程,但写的很离谱,维护的状态是分成了几段,也没法处理题目的要求,最后这题尝试纯枚举子集来作为分割点,但是写的过程中发现很难处理,考完之后才知道可以直接把连续的01串当成划分的集,寄寄寄。第三题看了看之后发现题目的条件很多,要写的话会耗很多时间,况且也没看出来部分分有多好写就给放弃了。最后一题一开始看到奇质数这个词的时候想到了哥德巴赫猜想,但又没发现跟题有啥关系,看部分分分布以为是分类讨论,后来发现若两个X[i]位置之间的差为奇质数,那么只需要两次就能消除影响,又想到了差分别为偶数和非质奇数,于是想了想怎么把两个奇质数进行匹配,一开始想的是用二叉堆,但不知道怎么分类,因此没法做到动态维护,后来看题解才知道这题竟然是网络流,但是最后部分分的结论也写假了,只得了20分。今天考试很寄很寄,总结一下原因:
一是因为我确实很菜,之前的摆烂以及不会就看题解的做法是根本原因,对于一些算法,我只是知道个大概,或许它是这样实现的之类的想法,使我不敢于写代码,对于一些算法真正的思想精髓并没有很好的体会。
二因为考试的时候遇到没法直接想到代码实现方法的思路直接扔掉,而不深思,这是一个很大的问题,也是我写大模拟太少造成的,对代码功能的理解不够深刻,对于一些实现上的细节总会觉得很麻烦,想逃避。
三是太想要快速拿完部分分了,总觉得部分分很无脑,随便想想都能拿,于是养成了糊结论的习惯,而理性的逻辑推理能力却没有得到发挥。
总而言之,继续打好基础以及锻炼独立思考以及推理的过程和能力是solution。
上午考完后内心很难受,虽然这个分才是能体现我真实实力的分数,但依然不愿意接受。在12点后就自己一个拿着球到高一的篮球场去投篮,虽然地上都是积水,还因此滑倒了,但每次投篮都感觉内心的郁气有所排解,特别是边投边说脏话,现在发现脏话真是中华文化的精华,骂着许多人的时候感觉确实很不错,还不会被别人听见,没有一点顾虑和负罪感。
早上的时候背了苏轼的江城子,还读了读纳兰性德的那首悼念亡妻的词,忘了叫什么了,只记得最后一句:“清泪尽,纸灰起”。
9.28
今天考的好像还不错,也可能是题目太简单了。第一题看到后就想着推式子,发现后两种情况可以算一种,而且对于任意一个a,若a能满足存在bc使得a^2 = b^2 + c2,则一定可以满足存在bc,a2+c2=b2,于是就把式子推了推,发现一个可以严格小于O(n)的做法,并且达到算法极限复杂度的时候是不合法的情况,容易证明不合法的情况就是当a<=2的时候,所以算法就给过了。当时还想到一个解法,就跟圆上的整点那道题一样的思路,可以用勾股方程k(m+n)^2 = k(m-n)^2 + 4kmn来解,枚举n,则可以由a与n推出m,此时再判断一下nm是不是完全平方数就行了,非常正确,但是没写。第二题一开始想的是树链剖分加线段树,断边可以理解为将边上两个点做标记为1,查询最近的可到达的没标记的点的距离可以用第k大来搞,但是树链剖分加主席树在写的过程中发现很难把节点的dfs序进行转化,而且一个连通块的区间也需要暴力来跳,于是写到一半便寄了。之后又想拿链的部分分,想的基本也是上面的思路,然后存标记用两个vector,每次往前找和往后找的时候直接用lower_bound,结果,结果,lower_bound寄了,这函数原理二分,要求有序,需要自己写个倍增搞,我倍增又写寄了,于是最后只能把30分的暴力给拿了,结果数组开小了,my暴力直接90分,惊呆。第三题没咋想,就像拿个10分就走,然后结论胡错了。第四题以为是什么数学上的结论,可能要很麻烦的证明,于是就只打了暴力,一开始以为只能把第一个点过了,后来没想到这题暴力也能拿30分,最后看了题解,模拟退火!!!这我竟然给忘了,好久没用过,exp函数都不知道咋定义了。
总而言之,今天算是不错的发挥。
窗外下雨,听着徐秉龙的《想自由》。
为将来的难测,就放弃这一刻......
10.6
回学校了,国庆假期过得很开心,有喜欢的人陪自己散步,有挚友一起play basketball,还可以睡大懒觉,非常幸福,听到两首非常好听的歌,《悬崖上的烟火》,《忘记时间》。要开始调整作息了。或许会更清醒些。
10.7
今天打了一天淀粉质,感觉手要麻了。
下午打球进入了ZONE模式,并意识到要注意脚步朝向和出手速度,三指发力投篮会更稳定。因为昨天晚上的事,寝室就剩我和hgl两个人了,感觉会很孤单。想听《风驶过的街道》。
10.8 + 10.9
昨天打了三场比赛,一直打到10点,所以没时间写记录,今天晚上补完一道根号分治加二重数集的题后便开始着手写记录。昨天打的发挥好,第二题第一个部分分很简单的特判给忽略了,第三题数组开小,痛失40分。晚上codeforce的比赛div.2的第四题没有想到调和级数存最大值,Atcoder的比赛更是没能专心做一道题,导致爆零。今天早上逃避着补第二题,后来还是开始补了,只不过最终也是补到70分就选择放弃,我觉得太复杂了,然而我知道这种事情一旦逃避,便难以再勇敢面对,然而我无力。下午学了分块和二重数集,但其实扫描线我还是没怎么学会,只是弄清楚了怎么用排序去维,和数据结构维护维度。一晚上都在补第三题,因为容斥的问题,纠结了很久,可以看出我的容斥学的真的很拉跨。想想,这两天过得确实是有些空虚,但或许,也很值得。以后的我大概也难以回味这种时刻,很久之前的气息,我已难追寻,唯有几幅画面如碎片般被连接起来,形成一段甚为短暂的记忆,但或许也不是坏事。适应能力越强,才越适合生存。
10.10
今日比赛爆零,但好像题非常难。哎。第一题一开始想着正确的暴力思路,后来忽然想到对于两次相邻的询问,改变的只有两个位置,便考虑了用链表维护每次的改变,但是其实没有必要,因为查询依然是对最初的序列进行维护,所以没必要维护这个改变。下午补了补这个题还有第三题,是一个找到特殊性质然后贪心,拓扑排序,删边即可得到答案。
10.11
今天考试小丑了,倒着写题,第四题花了一个小时,结果多加了一个if,导致100变成0分,然后第三题加了点小优化硬是在O(n3)的情况要求下,用理论O(n4)得了91分。好了,最小丑的来了,我以为大家都是倒序开始写,因为一开始前三题没有数据,但是没想到孟源很快就A了第一题和第二题,我现在对图论有一种莫名的恐惧,导致只想着拿第一题和第二题的部分分,结果搞假了,两题都零分。下午开始补,才发现我的第四题是多么的遗憾。第二题因为点之间可以任意到达,所以可以直接排序后贪心扫一遍即可。第一题也不是很难,只用考虑到达终点最多做一次地铁,并最好就是从1点开始坐地铁最短。其实都不是很难推出的结论,可我依然因为对图论这种题型的陌生与恐惧而放弃了思考正解,还是不够自信啊。
之前有一段时间,因为我经常投丢了球,便开始怀疑自己,并且不敢再出手,而是犹犹豫豫传给队友。可后来,我在网上看到一句话:“投丢的不过是球,而不是你的自信。只有出手,才能得分。”
是啊,害怕什么都解决不了,这个道理在无数的故事中都见到过,可唯有这种事情真正发生在自己身上时,才能深切感受。后来我并不再畏惧出手,即便投丢,也只是反思自己是否发力不对,或是姿势错误,而不是做无谓的后悔。
题也一样,现在距离noip很近了,这很大程度上能影响我的高中生涯,所以我会紧张,会怀疑自己。但也不是明天就上考场,还有至少一个月的时间。遇到陌生的题型就去刷几道,停课反正多的就是时间。所以没必要害怕,理智即可。
10.12
今天没考试,正常写题,上午把图论里的最小生成树和最短路还有连通性问题复习了一遍,都是很基础的东西。下午学了字符串,总算是把kmp这个东西彻彻底底搞懂了,之前也学过一次,不过没过一段时间就忘了。然后把manacher和Z学了,这两种算法学的时候一直在将算法的原理与根据已知信息的特殊性质来推位置联系起来,然后发现这两个算法确实很巧妙,有时间了把这两篇算法也补上。
下午打球,最后终于找到了之前上篮的感觉,或许早点合球然后起跳会使我更快,需要训练的就是在空中的稳定性。
10.13
今天打球很不错
10.14
或许投篮过程求完整的话会更准一些。不要因为投篮准一些就忽视脚步。补篮其实不跳更稳一些。
10.16
今天考试不是很好,第一题少考虑一种情况挂了,以后绝对不能自己带入这种想当然的局限性想法。第二题增加了或许以后可以通过改变求和顺序或者贡献对象来使用待定系数法,并思考其实际含义来优化计算。
上篮的感觉逐渐找到了,不应该是寻求对抗,而是钻过去,慢也好,快也好,要用速度优势来快速突破。投篮主要在合球后右手一定要正,正了的话,很多问题就能解决了。过人并不一定需要华丽的运球,一点小脚步能得到更为高效的成果。
今天早读哼了一首歌,枯木逢春的《这一生关于你的风景》,已经是很久很久以前喜欢的歌了,此时再度听到,并不觉得很悲伤。当时跟那个女孩分开了,我一直很后悔。总觉得“我多想能多陪你一场,把前半生的故事对你讲。在每个寂静的夜里我会想,那些关于你的爱恨情长。我多想能够把你照亮,在你的生命中留下阳光。陪你走过那山高水长,陪你一起生长。这一生在你的风景里,我是谁。”这段歌词悲伤,后悔,跟当时我的心境相吻合。只是几度春秋后,却是别一般滋味。我所感受到的不再是后悔,而是释怀。我多想,我多想,对啊,即便到了现在,依然还想,只是没有了当初那份愿意放逐一切的勇气,也或许,这份勇气被赠与了她人。最后一句,在你的风景里,我是谁,像是叹息,又像是感慨,也或许是,我是谁都已经不重要了。人的一生很漫长,跟我同龄的那个女孩,以后还有无尽的苦难与欢喜,她会遇见各种各样的人,有的人她爱,有的人她恨,或许在未来的某一刻,她脑中一闪而过有关我的记忆,或许她已不记得我的名字,或许她旋即就又忘了。但也或许她也怀旧,只不过我并非值得罢了。一想到这里,竟是松了一口气,如果真的不会在关心我以后怎样,那该多好啊。至少至少,存在于她概念中的那个个体,还没有那么难堪与复杂。
初中的时候,不是很好看,学习在学校里还行,但是很不老实,虽然现在也是。总想着和女孩谈恋爱,只是单纯的确定恋爱关系,就像一个小孩握住一个心爱的玩具,说这个是我的,你们都不能玩,很没意思,但也没什么恶意。后来谈了一场恋爱,分手后,宿舍里有些同学就问我恋爱的时候干过什么没有。我能干过什么呢,跟女孩那次出去约会,基本没准备,看电影也一句话都不说,也不敢看她,真是个大怂包,走的时候手都没敢牵。后来想起真是后悔。
但是,做完了这些,又有什么意义呢,珍贵的究竟是和对方的肢体接触,还是那种发自内心的青春内心的萌动。
高中后,有两个想法,很矛盾,一个是努力学习,跟女孩考同一个大学再去追求女孩,另一个则是找另一个喜欢的女生谈恋爱。暑假的时候有一个女生问了我高中有没有谈恋爱的打算,我当然有啊。可是当时却说了想要和初恋上同一所大学。唉,我也是一个视觉动物,肯定好看是女友的第一标准啊,可后来发现,也就高中刚开学会有学姐和一些同届的女生主动来找我,后来因为我不主动去找她们,便再无后事了。其实我的内心十分虚荣,初中的时候就是这样,也或许是因为自身的劣根性,很自卑。总是想要获得别人的认可,初中有的人说我帅,有的人说我丑,我也不确定,自己到底如何。高中后反倒没有这种烦恼了,也不知是因为周围的人素质都很高一直在夸我帅,还是我发现自己真的帅。虽然不是那种男神级别的人物,但总归应该不会让人觉得恶心了。
现在想来,都很有趣啊。虽然我仍处如今这个阶段,但偶尔回头看看,感觉倒也挺不错的。也不是非常非常在意那个女孩的近况,只是想着,或许有缘,这辈子才能再次相逢吧。当时她曾对我说出这样的话,她喜欢随着缘分,自然就能遇见该遇见的人。当时我觉得这种心态很无趣啊。明明命运掌握在自己手中,为何要听从那所谓宿命。
想到这里,又有些干涩,因为对于那个女孩而言,我也不过缘分而已。
还好还好,现在的我喜欢的女孩多了去了,只要有一个喜欢我,我就会很开心。这样不也挺好的嘛。
10.17
今天上午总结了一些做题的经验,下午学了数位DP,当时没好好学,现在算是稍微弥补了一些。
又补了补关于矩阵的知识。
早上起来的时候。很累。中午才想起来做的梦。
梦里一个女孩在我的面前走着,很可爱,我好像很喜欢这个女孩,所以追上了她,并且对她说我喜欢她,然后看见她的微笑,阳光下衬得如此迷人。她轻轻用手拂过右耳上堆着的头发,同时也露出那白皙的脖颈,轻言道:“好啊。”一眨一眨的眼睛,仿佛世间最为透亮的宝石。我竟不知为何伸手,触摸了她那如凝脂般的脸庞。然后凝望着她,直至梦醒,却如此难忘。
“风吹雨成花,时间追不上白马。你年少掌心的梦话,依然紧握着吗。云翻涌成夏,眼泪被岁月蒸发。这条路上的你我她,有谁迷路了吗?我们说好不分离,要用永远在一起。就算与时间为敌,就算与全世界背敌。风吹亮雪花,吹白我们的头发。”
“千年之后的你会在哪里,身边又怎样风景,我们的故事并不算美丽,却如此难以忘记。”
“问此间江湖年少,偏爱纵横天下,恩仇趁年华轻骑快马。红尘未破也无甚牵挂,只恋生杀,醉里论道,醒时折花。”
“纵千万人,吾往矣。”只见黑衣少年手持长剑,巍然不动。即便前方正是无数的铁骑冲来。
曜日正被乌云所挡,然而少年眼中却依然闪着光芒。很快,铁骑都包围了上来。只见其中一人笑道:“瑞恩尼,今日你无论如何都要留在这里了,我会将你好好埋了的,哈哈哈哈。”
只见少年依旧沉默,只是下一刻,他立即拔剑,只是一瞬间,所有靠近少年的铁骑都被击倒,又一瞬过去,只见沙场之上,唯有一人剑指苍穹。却又缓缓放下。
“即便如此,我也依旧没能救下你。对不起。”话毕,少年眼角一抹水光乍现。
他记忆中,那个身穿青色衣裙的女孩的身影,却是疾逝而终。
“对不起,雨烟。”
10.18
今天考炸了,没啥可说的,太菜了,该静下心思考了。
10.19
今天考的还行,明天继续保持。第一题一眼看出转换遍历对象为值域即可,又一眼顶针看见数据范围1e6,轻松O(n log n)预处理约数,并计算贡献。第二题一开始想的用链表维护一个离散的数轴,后来发现操作很麻烦,又发现,每次给出数学式的实质是将两个集合中的数的相对关系进行确定和计算,然后迅速写完,调了10min的偏移值计算,然后过了。第三题一开始看错题了,以为是求所有点对点权乘上其路径之和,去厕所的时候轻松想到换根处理一下就行。回来看到N的范围才发现自己看错题意了,是最小边权,此时距离考试结束还剩不到一个小时,把最无脑的部分分打了打,然后去打第四题的部分分了。第四题一开始没看懂什么意思,后来发现有10分轻松暴力前缀和拿,但是或许是因为紧张,二维前缀和写挂了,没过样例,后来改完了。此时距离考试结束只剩下3min,造了一组数据,发现过了。结果成绩出来后第三题挂了15分,第四题挂了10分。
主要是第二题一开始想着写链表,但其实内心想法并不清楚,结果重构了两三遍还没写出来。浪费了两个小时。
今天下午补了补第三题,状压DP,其实也不难,但是考场的时候没想到。唉。猿神考试的时候想到了随机化,真的太会玩自己阳寿了。
晚上又写了两道状压DP,感觉还行,不是很生疏。
10.20
今天又考炸了,想着先把第一题磕完,结果没过大样例,大样例又手算了了好久才知道某组数据为啥是对的,然后看时间有点久了,就去开第二题,结果此时大脑已经有些迷糊了,大概想了一下就开始写,结果写完发现没过样例,发现自己又太鲁莽没有想到后面符号对前面相对值的影响,于是又重构,最后过了样例,自己造的数据没过。哎。此时距离考试结束只剩下20min了,我迅速的靠感觉打了第三题的10分,又第四题随便糊了糊。然后结果都写挂了。又烤了倒一。哎。
10.22
昨天考了CSP,第一题挂了,第二题超过了大众分,也大概从中吸取了一定的教训。不被他人所影响,仅由自我的思考作为一条路走下去。明天就打班赛了,或许是我高中生活的唯一一场也是最后一场班赛,我一定会竭尽全力。
忽然想到小学的时候,老师让测试投篮,我一分钟一个球也没进。体育老师说为了鼓励我,算我投进一个。但我内心依然对篮球这项有略微的抵触。后来和初恋在一起的时候,她向我说她喜欢打篮球的男孩,因为她觉得她哥哥打球很帅,所以就在我的内心又留下了一颗种子。
与她分别后,或许更准确地说,在很久没见过她,她也没见过我后,忽然想要尝试一下这项运动。也不知是为何。上高中后,学校的休息时间很多,我便抓紧一切时间打球,与其他人的社交也逐渐淡化。打篮球进入到了一种狂热的地步,我疯狂地想进球,想防住对手,想要通过这些来获取价值感与认可。但这,似乎并不罪恶。
一直到了现在,之前在学校就跟同学打,回家就跟初中的挚友打,虽然时过境迁,但他们都会克服各种困难来一起打球,而也正是因此,我真正感受到了分别与相聚的意义。
篮球陪伴了我很多,也教会了我很多,这样说或许不具体。坚持,不服输,理智,冷静,勇敢,信任,承担。虽然篮球也让我失去了很多。
然而这并不算什么,只希望等我十年后,依旧能如现在一般勇敢。
10.23
上午考的一般。主要是记录篮球班赛,已经写在了另一篇随笔中。下午偷偷带的手机被发现了,唉。晚上只能看竞赛书解闷了。
10.24
今天早读没睡着,很大的进步。
考试一开始花了20min看第一题并初步想出一个做法,因为可以得到一个性质,对于有宝箱且打开宝箱所需时间最小的位置,一定是直接开宝箱,并且可以进行BFS,通过O(n)的时间进行更新。差不多想好了之后我就开始看第二题,第二题是个求区间贡献题,感觉跟昨天晚上做的第三道CF有点像,但当时没补,但看了看发现只要推出一个区间中1的个数与答案的关系就能拿很多分后就决定拿该题的部分分。接着去看第三题,第三题是个关于最短路的题,想到一个很暴力的做法,能拿5分部分分,但那个暴力码量较大,特殊点也不是很懂怎么做,决定这场比赛最后再搞这道。然后去看第四题,发现第四题在k=1时有30分的部分分,并且也很快有了一个将唯一一个魔法使的点作为树根然后进行递归求解的想法。看完四题后,此时已经8:30,大概估算了一下应该能拿的分,第一题100,第二题40,第三题30。
如果都能拿到的话,这场比赛也算打的不错。
然后我开始先写第四题,第四题写的很顺利,大概写到9:00的时候过掉大样例与自己造的样例。接着便开始写第一题,第一题原本写的dfs,发现过不了大样例,便开始想算法的问题,发现原图中是有环存在的,也就是可以由后更新的点再更新前面的,所以加了一个循环,成功过掉n^2暴力,再给k=1加个特判,理想分数已经达到70分,这时我内心想着自己总分已达到100,怎么说也不是很拉垮了。究竟是继续把第一题A了,还是做我并不熟悉的第二题呢?
想了想后,发现此时时间还剩两个多小时,我就再解决第一题解决20min,如果解决不了,我再换到第二题。然后我又想更新的话是否可以利用类似拓扑排序的方法BFS一遍然后得出答案,然后很快的打完,发现没过。直接转到第二题。第二题n<=10的数据轻松枚举全排列,然后发现k=1直接找每个1左右的极长零串就行,但没想到O(n)解决的方法。于是就先把恰好有k个1的15分拿了。想的是答案就是C(n,m)即可。
此时距离考试结束还有一个小时多一点,第二题想解决k==1部分分浪费太多时间了。又看了一遍第三题,还是没什么思路,于是开始好好思考第一题,我发现可以进行一个多点BFS,同时用优先队列来维护。然后轻松过掉大样例与手造数据。此时距离比赛结束还有10min,我又看了一遍所有代码的freopen以及数组大小。
考试结束,打开成绩表。什么!?才60。第一题只拿了40分,第二题只拿了20分,第四题保龄。
然后我打开第一题错的点,发现很多都输出了我定义的inf,把inf改成5e10,过了。第二题发现数组开小了开成了2e5,应该开成1e6的。第四题不知道为啥错。后来被告知第四题题目栈开小了,三十分还是有的。这次考试提醒了我1e9并不能无脑的作为极大值。还有一定要看数组大小。这次属实是被数据范围给gank了。但总的来说对于时间的分配和选择题目的策略还是比较不错的。
10.25
今天还是挂题了。
先写些其他的,因为马上就要打班赛了,我决定还是把这件事写出来,这样或许能释放一下内心积压的情绪。
今天中午训练完之后,在宿舍遇到了李坤峰,便想对他打个招呼,问他听没听说我带队杀出重围成功出线的事。但他只是怀着很不屑的语气说:“那都是二班让你们的。本来许恩祈和李沛函说好的,让十六班上那些菜的,然后放水给二班,让二班赢,所以二班让还没恢复好的许恩祈上场打了。你们这趁人之危有什么好说的。人家都没认真防你才让你能投。”然后我直接愣住了。我根本不知道有所谓的“说好的”事,更为这种言论感到不可理喻,最难以接受的是,这李坤峰竟然是真的这样认为的,而并非是所谓同学间的玩笑话。然后我也不知说些什么,我想要去问问李沛函和其他人究竟事实是怎样的。或许我也很在意舆论。没有找到李沛函,但刘嘉禾向我说明确实是有此事,并且二班有些人以此为由攻击我们并散播这种言论。得到确认后,我便突然感觉失去了什么似的,刚刚训练打出来的自信又消失了,并不是因为害怕,我知道二班那群人即便认真打也不能赢我们,可我还是感觉怅然若失。我错了吗?这是一个很荒谬的问题,我当然没错,我就是拼劲全力去打比赛,去为自己班级争得那一丝希望,不管对方认不认真打,我的答案都是这样。那么错的是他们咯?为什么不是他们,他们把所谓篮球班赛的胜负用这种根本错误且自私的约定来决定是绝不应该被认同的。可为什么明明对错如此明显,我还要如此在意那些外班人,甚至是敌人的目光。甚至因此影响自己的心态。也或许我真的把李坤峰这些人当成了朋友?所以觉得朋友如果说这种话就是背叛,如果朋友相信诬陷自己的言论就会觉得会不会真的是自己的错,为了想要维护这段所谓的“友情”而选择放弃原本属于自己的一些东西。
是有人站在我这边的,如今我们十六班那些一起期待班赛获胜,班级获得荣誉以及为此努力付出的同学,是明白这种言论就是无稽之谈的。可是谁也说不定某一天他们也与我为敌了。
在一段时间之前,我因为为了逃避某些事情基本切断了无谓的社交行为,不想与别人分享任何关于我的事,我害怕他们和曾经那群人一样,拿着这些事来攻击我。更不把任何外人作为信任的对象,因为一旦信任,就会在乎他们的想法,一旦在乎他们的想法,被背叛时就会难受至极。可我过了一段时间还是选择了向某个人敞开心扉,好在这个人从那时起到现在一直很善良,我于是开始尝试去信任同班的同学,在打篮球的过程中也逐渐增强了对对方的了解。于是我的信任便开始泛滥起来,我以为那种事情不会再发生在我身上,我以为这次选择的说不定都不会背叛。可是这种事情还是发生了。上一次发生这种事情时,只有一位挚友愿意为了我与那些所有人为敌。这次或许不需要其他人的帮助了,反正只要把那群人全都用实力打服,打闭嘴就行了。或许我一个人难以做到,但好在,还有其他我依旧信任的同伴。
okok,昨天打班赛没上,因为李沛函打的确实很强,我上肯定没有他得的分多。但奈何这裁判因为自己班没法通过不合规的方式出线,就给我们班吹黑哨,让对面罚了二十多分。没啥可说的,八班和我们班打的都很好,最不可理喻以及卑鄙无耻的只有裁判一个人。
昨天考试策略上出了点小问题,第一题很快就给过了,暴力模拟一下就行,因为每次合并的书堆的大小选择小的的计算次数一定是小于等于此次合并书总数的一半的,所以利用累计贡献的想法可以推出来时间复杂度约为O(n log n),但这题卡常,非常离谱。痛失30分。第二题考场上其实想出来60分的大概思路了,就是对于每个竖线是否被拦截来计算相应情况的贡献,并且好像有类似子结构的性质。但考场上还是觉得有点不够严谨,自己也只是把样例试了试。最后实在不行第二题写了个hash拿了点最基础的部分分。第三题一看就觉得是线段树优化建图,大概看了看第四题后我觉得第四题比第三题更可做,于是开始去写第四题,第四题看起来像个之前做过的一道老鼠偷奶酪的题,但仔细想了想,发现这个如果用DP做条件太多,而且设计的DP状态也难以维护,但我始终认为这题就应该是DP,所以一直在想这题,结果想了一个多小时,这是本次比赛中最大的失误,还是有那种强迫某个思路一定是对的于是一直死想某个思路的问题,但好在问题随着每天晚上打CF已经得到了一定程度的解决。打CF的时候时间很紧张,需要快速想出思路并证明实现的可行性。好在最后第四题还是打了个贪心骗到了12分。
估分:100 + 10 + 0 + 5 = 115
实际得分:70 + 10 + 0 + 12 = 92
第一题挂分主要是没意识卡常的问题,大样例给的数据只是1e5,但数据范围是1e6,本地跑1e6的范围实际上是1.2s左右,所以下次对拍时需要自己造一组撑满数据范围的数据看看跑满后时间多少。
从昨天开始,每天尽力把打的codeforce上的题也整到这上面。
CF1849D Array Painting
题意:有一个长度为 n 的数组a ,a[i] = {0,1,2}一开始所有元素均为蓝色。
可以有如下操作:
用一枚硬币,把一个蓝色元素涂成红色;
选择一个不等于 0的红色元素和一个与其相邻的蓝色元素,将所选的红色元素减少1,并将所选的蓝色元素涂成红色。
要将所有元素涂红,最少需要多少硬币?
思路:首先可以得到一个贪心的策略,我们第一个涂红的蓝色元素值一定是数组中的最大值。然后根据第二个操作我们发现相邻元素可能会有传递颜色的性质,于是我们得出一个结论:对于每个所有值大于0的连续段实际上都只需1个硬币即可,然后我们考虑,对于值为0的点,可能被连续段影响,但不会再传递。考虑枚举指针pos,对于一段连续的染色段,必定将其第一位前面的位置继续染上色,如果已经被染上色,则将其最后一位后面的位置染上色,最后对于pos==1的情况进行一下特判即可。
CF1861B Two Binary Strings
题意:有两个长度相等且以0开头、以1结尾的01串。现在可以对任意一个串不限次数的做操作:选择两个下标l,r在串上这两个位置的字符必须相同),把[l,r] 区间内的字符全部替换为与它们相同的字符。能否在若干次操作后两字符串相等。若能达到,输出 YES;否则输出 NO。
思路:注意到题目已0开头且以1结尾,那么最终两字符的状态一定是前面一段0后面一段1,能出现这种情况,当且仅当,存在a串某两个位置为01且b串相应位置也为01。
CF1860C Game on Permutation
题意:两人在一个长为n排列p上玩游戏,先手初始可以任意选择一个位置(注意先手不能选择一个不能移动的位置),然后他们以先手选择的位置为起点后手先依次交替移动,每次只能向左移动到比当前数字小的位置(即如果i<j 且 <pi<pj,则可从j 移动到 i ),如果一个人不能移动,则此人获胜,请问先手开始选择有必胜策略的位置的个数。
思路:考虑对于一个第一个数必定是必败局面,并且考虑一个数是必胜局面当且仅当他所能到达的必败局面存在,并且所能到达的必胜局面不存在。用两个树状数组进行维护即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
int const maxn = 3e5 + 10;
int read(){
int res = 0;
char ch;
ch = getchar();
while(isdigit(ch)){
res = (res << 1) + (res << 3) + (ch ^ 48);
ch = getchar();
}
return res;
}
int T[maxn];
int n;
int lowbit(int x){
return x&(-x);
}
void add(int x,int v){
for(int i = x;i <= n;i += lowbit(i)){
T[i] += v;
}
}
int ask(int x){
int ans = 0;
for(int i = x;i;i -= lowbit(i)){
ans += T[i];
}
return ans;
}
int T1[maxn];
void add1(int x,int v){
for(int i = x;i <= n;i += lowbit(i)){
T1[i] += v;
}
}
int ask1(int x){
int ans = 0;
for(int i = x;i;i -= lowbit(i)){
ans += T1[i];
}
return ans;
}
int p[maxn];
signed main(){
int t;
t = read();
while(t--){
int ans = 0;
cin >> n ;
for(int i = 1;i <= n;i ++){
cin >> p[i];
T[i] = 0;
T1[i] = 0;
}
add(p[1],1);
int cnt = 0;
cnt ++;
for(int i = 2;i <= n;i ++){
if(ask(p[i])&&!ask1(p[i])){
ans ++;
add1(p[i],1);
}else if(p[i] < p[i-1]){
add(p[i],1);
}
}
cout << ans <<'\n';
}
return 0;
}
10.26
今天上午补了补昨天的题,然后补了补去年noip的题,要是以现在的实力去考应该能考个153左右的成绩。
下午开始复习模板,把没有go团队里的模板按顺序补了6个左右,缩点的那个模板现在还不会打。
晚上考了CF模拟赛,被调皮的孟源给我设置了注销,但也无碍,不过些许风霜罢了。模拟赛出了点小问题,第一题看错输出格式挂了六发罚时,第二题没有仔细思考就开始写,结果又挂了好久。好在第三题比较简单,很快就过了。第四题差不多找到方向了,奈何最后时间不够,内心也有点着急没做出来。
发现入金秋后傍晚打球必须戴眼镜了,不然框都看不清。
10.27
今天是10.27号。
10.28
今天天是10.29号。
10.29
昨天是10.29号
10.30
昨天晚上没睡好,可困,早读还被李老师一直盯着,睡不了,导致考试的时候略有点困。一开始看第一题,想了大概十分钟,想到一个贪心,发现或许能过特殊点,于是去看第二题,第二题看着像一个维护集合的东西,但是也不是很懂题意,然后去看第三题,第三题有点小思路,维护区间内1的个数就行,去看第四题,发现是个期望,直接寄掉。大概算了一下分,第三题或许能A,第一题尝试打,第二题最后写。于是开始写第一题的贪心,确实没过自己手造的样例,但部分分好像可以。于是又挣扎了一会,发现根本不会写状压DP的转移方程,于是去写第三题。轻松5分钟写完,轻松过样例,一测大样例,寄。于是我重新又看了一遍题,发现自己没看见增加两个字,于是开始重新想第三题,从大样例里截取一段小的数据开始思考,发现对于连续的0长度不超过1的连续01串是应该尽量加的,并且策略选先加完后减一定是可以最优的性质后,便开始写。写了一会,发现只过了小数据,还有可多没过。于是我便用01与10这两个特殊相邻串又写了一份暴力。过了大样例。写到这里都快结束了,主要今天可能确实没睡好,脑子感觉一直跟一团浆糊一样。
下午我尝试用莫队写第三题,但寄了,移动端点时的贡献不会算。然后老师讲了正解动态DP,略微学了学,然后过了。
10.31
今天上午考的不是很好。
一开始看了第一题,觉得这就是一个很基础的签到题,想到一个将数列每两个分成一块的做法后便开始看后面的题,第二题题意不是很能看懂,第三题似乎可拿暴力分,第四题看起来很简单的样子,但是我知道只是看起来,大概算了一下,要是顺利的话,第一题A了,第三题拿个30分保底,剩下的从第四题尽量拿。于是便开始写第一题,但是第一题挂了,挂了好多个思路,写了两个小时才写出来正解,此时我去写B的暴力,很快想出来一个用bitset优化的维护能被到达的点的集合的做法,样例过了,大样例没过,一直很疑惑为什么没过。中间也想过重构,但还是没敢。最后啥也没写成。实际成绩100。考差的一个很主要很主要的原因是第一题实在浪费了太久时间了,而且之后比赛策略也不是很好,思路没想清楚就直接写浪费了很多时间。
11.1
无事
11.2
早上开始先看第一题,第一题看了一会想出一个贪心和一个DP和一个暴力,然后开始看第二题,第二题看了一会发现只会打暴力维护矩阵,其实也想到了类似线段树维护矩阵的想法,但还是没能想到如何实现。然后开始看第三题,觉得这题很思维,没啥思路,看第四题,觉得很像去年noip第一题,可能是四道题里最简单的。然后我开始写第一题,第一题写了1h的65分暴力,大样例没过,于是决定直接把四题能打的暴力都打完,于是第一题开始写暴力,快10点的时候暴力全部打完,此时不出意外有了90分,于是我开始重新看第一题,第一题又想到一个双向搜索的思路,但我复杂度记错了,记成优化复杂度只有1层,于是选择了放弃。然后开始看第三题,第三题想了快30min啥都没想到,于是又去想第四题,第四题最后也没想到有什么可以优化的地方。最后得分还是90分。
今天早读发现如果去教室外早读会很有精神。从今天起,早读不摆了,暂时把篮球放放,至少这一段时间少打点篮球,多点时间去放在生活中的其他事上面吧。
今天晚上的时候没有一下课就去打球,买完饭,我独自一人走在校园的路上,看着耀眼的夕阳与浓烈的云,忽然冒出一个念头,上一次这样悠闲地看日落是什么时候呢?
或许是暑假某个疲惫的傍晚,我和某人一起走在河边,聊着一些无所谓的事,一会低头,一会抬头,听那晚风吹过树梢的沙沙声,看着斑驳的叶影逐渐染黑地面。在那夕阳即将彻底消失于眼前之时,那人要我为ta拍一张照,透过相机,我看着,那人看起来真得很孤独。然后,苍蓝的天空将最后那抹橘红也淹没。
11.3
今天考倒一了。一开始先看第一题,发现是个计数,想着这毕竟是第一题,或许可以找规律?于是很快的打完了二进制枚举,然后算了30min,啥有用规律都没找到。于是开始看第二题,第二题发现一个合法方案最终造成的数所有的质因子指数不超过一,于是可以预处理预处理每个数唯一分解,然后n方找到一定不能跟某个数在一起的某个数,这时的复杂度严格小于O(n ^ 3),然后在通过某种方式维护所有可以匹配在一起的数,然后组合数加容斥优化即可。但又仔细想,发现数之间的是否能够匹配不具有传递性,不能用类似集合的方式来维护,于是纠结了很久,然后想到一种方法,每次可以将某个数与它可以匹配的数进行连边,若有x个点互相可达,就可以将这x个数进行任意匹配。然后发现不会写,然后寄了。然后写暴力。然后看第三题,发现第三题链比较好写。然后去看第四题,发现第四题暴力分都不好拿,于是回去看第二题和第一题,然后啥也没想出来,然后去看第三题,想到一个n方做法,然后去做,最后过了自己造的数据。然后觉得自己行了,然后比赛结束,然后小丑了。第一题暴力超时,第二题挂分,第三题挂分。
今天下午吃完饭后发现天空很美,或许是刚下过雨的缘故,天空被渲染成了粉红,我独自看着,觉得这样就挺不错的。看着绿茵上奔跑着的少年,猛地发觉这或许正是在某本书里曾触碰过的感觉,难以描述。空气中氤氲着潮湿,就像在小说里。
写一下今天补第一题时的思路吧,没看懂第一题题解的语言,但也大概理解了代码的想法。考虑每加一个点时的影响,新加一个点根据层数不同和左右子树大小关系可以写出两个转移方程,然后一代就行了。
11.6
没啥可说的,还是倒一。、
11.7
今天倒二。第一题看了2分钟,手玩出两种情况,一种菊花一种三元环,10min写完,过了大样例,打算先写其他题,在10点的时候开始重新思考第一题并尝试写对拍。然后开始看第二题,第二题很快想出状压拿20分并特判拿多拿10分的思路,然后发现数据范围值li 与 ri 之间长度不会太长,而且n只有1e3的范围,于是考虑能不能贪心,然后写了一个贪心,过了大样例,没过小样例,然后思考了ci == 1的情况,发现贪心是对的,此时第二题50分,理智告诉我,先去把暴力打完再说,然后很快的看了第三题和第四题,并写了暴力,但是我比较老实,只拿暴力该拿的分,加了数据范围的特判,然后后来第三题数据太水少了30分。然后写了第一题的暴力,然后过拍,然后去优化第四题,由多拿了10分,最后济天下苍生,而我独自黯然。
下午复习了可持久化线段树。
大课间的时候很快地去买了热干面然后去看足球班赛,张润泽确实踢得不错,但有时候有些事情没办法。
11.8
今天还是挂分了,现在考试的状态逐渐恢复过来了,但是粗心的错误还是会犯,一定要注意。
那种难以言说的感觉越来越强烈,我很害怕,我觉得它能摧毁一切,它正在袭来,而我不知所措。或许我也知道那是什么,可是我并没有能力去改变些什么。
下午大课间,孙驰航送给了我三本电影原作小说作为生日礼物,感觉很温暖。
晚上打CF差点AC4题,但是还是没,但是罚时比较少,所以rk1(tg组里),今天晚上打的节奏其实还挺不错的,思考问题也一直很有方向性,第四题只是实现出了点小bug,主要是因为今天晚上打的时候放平心态了,没有很着急地去提交,而是再三进行思考,并且想思路时,也是循序渐进,一步一步地平稳思考,并不急躁。在得到一个小思路的时候,用注释边想边打思路,非常清晰,对于现在头脑不知为何莫名混乱的我,是个很大的帮助。
11.9
上午写了几道题,代码下面都写了思路。
P7113 [NOIP2020] 排水系统
这题比较简单,卡的点不是算法,而是高精,但是因为我比较懒,所以用__int128,但是__int128打成_int128调了半个h。
考虑该题的递推一定是由入度少推到进入度多的,那并且可以考虑将所有
对某个节点流水的体积有影响的前驱节点都先处理完后再处理该节点,自
然而然想到拓扑排序,方便处理题目的递推顺序。
考虑对于一个起始节点,其p为1,q为1,对于一个非起始节点,设其此时
分子为a,分母为b,前驱结点分子为c,分母为d
则对他造成的影响应当是:b = bd , a = ad + b*c,同时a,b化为最简
分数。
#include<bits/stdc++.h>
#define int __int128
using namespace std;
int const maxn = 1e5 +10;
int in[maxn];
int p[maxn],q[maxn];
vector<int> G[maxn];
inline unsigned int read(){
unsigned int res = 0;
char ch = getchar();
while(!isdigit(ch))ch = getchar();
while(isdigit(ch)){
res =(res << 1) + (res <<3) + (ch^48);
ch = getchar();
}
return res;
}
inline void print(unsigned int x){
if(x > 9){
print(x/10);
}
putchar(x%10 + '0');
}
int gcd(int x,int y){
if(x < y){
swap(x,y);
}
if(y==0){
return x;
}else {
return gcd(y,x%y);
}
}
queue<int> Q;
signed main(){
int n = read(),m = read();
vector<int> ans;
for(int i = 1;i <= n;i ++){
int d = read();
if(d){
for(int j = 1;j <= d;j ++){
int x = read();
G[i].push_back(x);
in[x]++;
}
}else {
ans.push_back(i);
}
}
while(Q.size())Q.pop();
for(int i = 1;i <= n;i ++){
if(in[i]==0){
Q.push(i);
p[i] = 1;
}
q[i] = 1;
}
while(Q.size()){
int u = Q.front();
Q.pop();
int k = G[u].size();
if(!G[u].size())continue;
q[u]*=k;
for(int v : G[u]){
p[v] = p[v]*q[u] + p[u]*q[v];
q[v] = q[v]*q[u];
int g = gcd(p[v],q[v]);
p[v]/=g;
q[v]/=g;
if(--in[v] == 0){
Q.push(v);
}
}
}
for(int i : ans){
print(p[i]);
cout <<' ';
print(q[i]);
cout <<'\n';
}
return 0;
}
/*
考虑该题的递推一定是由入度少推到进入度多的,那并且可以考虑将所有
对某个节点流水的体积有影响的前驱节点都先处理完后再处理该节点,自
然而然想到拓扑排序,方便处理题目的递推顺序。
考虑对于一个起始节点,其p为1,q为1,对于一个非起始节点,设其此时
分子为a,分母为b,前驱结点分子为c,分母为d
则对他造成的影响应当是:b = b*d , a = a*d + b*c,同时a,b化为最简
分数。
*/
[NOIP2004 提高组] 合并果子 加强版
看到题的第一眼,想到区间DP,然后看一眼数据范围,发现很不合理。
于是考虑该题是否存在某个策略可以再O(n)遍历过程中完成计算,
容易想到最终答案一定由最初的每个a[i]贡献若干次得来,那么,考虑
让较大的a[i]贡献次数减少,容易想到一个贪心,每次合并都选合并后和
和最小的两个数。
先考虑用集合维护,但是发现用集合难以在O(logn)的时间复杂度内,
删除某个数的贡献。
而且本题1e7的数据范围,即便是O(nlogn),也难以通过。
于是考虑有没有一种O(n)的排序方式,发现a[i]的数据范围最大只有1e5
考虑通过值域进行排序,于是可以用1e5个桶分别统计数字出现次数进行排序
然后考虑怎么在计算的过程中维护合并最小值,我们发现之前用set比较难
是因为集合中的元素有重复部分,于是我们考虑将点作为研究对象,然后
先用一个队列维护一开始的序列,然后用另一个队列维护序列合并一次或多次
后的序列,这样的话我们第二个序列既保证了大小的单调性,又保证了顺序。
代码实现不难,就是这题还卡常挺nt的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int const maxn = 1e7 + 10;
int a[maxn];
int const M = 1e5 + 10;
int cnt[M];
queue<int> q1,q2;
int read(){
int res = 0;
char ch = getchar();
while(!isdigit(ch)){
ch = getchar();
}
while(isdigit(ch)){
res = (res << 1) + (res << 3) + (ch^48);
ch = getchar();
}
return res;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n = read();
int mx = 0;
for(int i = 1;i <= n;i ++){
a[i] = read();
cnt[a[i]]++;
mx = max(a[i],mx);
}
for(int i = 1;i <= mx;i ++){
for(int j = 1;j <= cnt[i];j ++){
q1.push(i);
// cout <<i <<'\n';
}
}
int ans = 0;
for(int i = 1;i <= n-1;i ++){
int u;
if(!q2.size()||(q1.size()&&q1.front() < q2.front())){
u = q1.front();
q1.pop();
}else {
u = q2.front();
q2.pop();
}
int v;
if(!q2.size()||(q1.size()&&q1.front() <q2.front())){
v = q1.front();
q1.pop();
}else {
v = q2.front();
q2.pop();
}
// cout << u << ' '<<v << '\n';
ans += (u + v);
q2.push(u + v);
}
cout << ans << '\n';
return 0;
}
/*
看到题的第一眼,想到区间DP,然后看一眼数据范围,发现很不合理。
于是考虑该题是否存在某个策略可以再O(n)遍历过程中完成计算,
容易想到最终答案一定由最初的每个a[i]贡献若干次得来,那么,考虑
让较大的a[i]贡献次数减少,容易想到一个贪心,每次合并都选合并后和
和最小的两个数。
先考虑用集合维护,但是发现用集合难以在O(logn)的时间复杂度内,
删除某个数的贡献。
而且本题1e7的数据范围,即便是O(nlogn),也难以通过。
于是考虑有没有一种O(n)的排序方式,发现a[i]的数据范围最大只有1e5
考虑通过值域进行排序,于是可以用1e5个桶分别统计数字出现次数进行排序
然后考虑怎么在计算的过程中维护合并最小值,我们发现之前用set比较难
是因为集合中的元素有重复部分,于是我们考虑将点作为研究对象,然后
先用一个队列维护一开始的序列,然后用另一个队列维护序列合并一次或多次
后的序列,这样的话我们第二个序列既保证了大小的单调性,又保证了顺序。
代码实现不难,就是这题还卡常挺nt的。
*/
11.10
昨天晚上发生了一些事,要开始走读力。
早读还被龙卷风用极寒之水攻击力大脑。
然后开始考试了。
一开始先看T1,发现是个构造题,然后题目还给了个checker,人还怪好的嘞。然后根据checker的思路想到了一个假做法,所需边的数量远大于题目的要求,但能拿10分。然后去看第二题,发现暴力的15分很好拿,又向下看了一个性质,发现还得用矩阵维护斐波那契数列,可麻烦。然后去看第三题,第三题看着很人畜无害,但是只会打14分暴力。然后又去看第一题,发现了一个小性质,然后70分到手,但是我的代码细节实现比较不错,得到了80分,然后打完第二题第三题暴力,又去写第二题第二个特殊性质,然后写炸了。然后最后50分钟去写第三题,最后还是没想到正解于是就把空间开得大了些,又多拿了6分。相当于一共多拿了16分。
11.13
补了补题,写了写板子。
写了最长公共子序列模板题。确实很菜,这题想了好久才想到咋做。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int const maxn = 1e5 + 10;
int const M = 1e3 + 10;
int read(){
int res = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)){
if(ch=='-')f = -1;
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return res * f;
}
/*
首先根据题意,可以想出来一个DP方程
dp[i][j] = max(dp[i-1][j-1]+(a[i]==a[j]),dp[i-1][j],dp[i][j-1])
*/
int a[maxn],b[maxn];
/*int dp[M][M];
signed main(){
int n ;
cin >> n ;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
for(int i = 1;i <= n;i ++){
cin >> b[i];
}
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= n;j ++){
dp[i][j] = max(dp[i-1][j-1] + (a[i]==b[j]),max(dp[i-1][j],dp[i][j-1]));
}
}
cout << dp[n][n];
return 0;
}
*/
/*
ok,成功拿到50分,我们考虑如何优化,考虑我们
进行DP转移的过程实际上有极多的冗余状态以及转移
考虑通过某种方式将这些状态优化掉。
我们再次重新考虑要进行一次转移需要哪些信息
首先,我们需要知道还未进行转移的最长长度,
然后我们要找到可以增大的转移部分进行转移。
考虑我们转移的过程中,对于第一个串,下标
是逐渐增大的,也就说这部分的转移有单调性。
我们考虑从这个单调性入手。我们可以考虑将
a序列的下标与b序列之间建立映射,即定义一
个映射
f(b[i]) = posa[b[i]]
那么我们根据上面的得到的下标单调性得出一个
很有趣的结论。
f(b[i])所形成的的新序列的最长上升子序列长度
即为a,b的最长公共子序列长度
然后我们再写DP方程
dp[i] = max(dp[j] + 1)(j < i 且 a[j] < a[i])
现在的复杂度依旧是O(n ^ 2)
但是我们如换一个想法, 考虑维护一个最长上升
子序列呢。设此时维护的子序列末尾是q[len],那么就
有两个情况
当新加的a[i] > q[len],那么用q[++len] = a[i]
当新加的a[i] < q[len],我们二分找到q里第一个大
于a[i]的位置将其改为a[i],思考一下为什么我们这
样是对的。第一种情况无需多言,第二种情况,因
为我们新加的a[i]实际上并不会影响我们此时的最长
长度,而且,当我们这样更新后,能够产生的第一种
情况也会更多。
*/
int p[maxn],dp[maxn],q[maxn],t;
signed main(){
int n;
cin >> n ;
for(int i = 1;i <= n;i ++){
cin >> a[i];
p[a[i]] = i;
}
for(int i = 1;i <= n;i ++){
cin >> b[i];
b[i] = p[b[i]];
}
for(int i = 1;i <= n;i ++){
if(b[i] > q[t]){
q[++t] = b[i];
}else {
int pos = lower_bound(q+1,q+t+1,b[i]) - q;
q[pos] = b[i];
// cout << pos << '\n';
}
}
cout << t << '\n';
return 0;
}
代码里是自己的思路历程。
然后去写了写互不侵犯,写的很麻烦,时间复杂度也比较卡,一看去年10.22号提交的代码,确实很简洁。然后写了写飞行路线这个分层图最短路模板题。
打了一下三分板子。没见过三分的题,而且这种三分求极值的好像可以直接求导搞,但好像还得二分。
然后写了写pbds,差不多背下来了。但好像没啥用。
发现现在真的很迷茫啊。模拟赛天天打,但是好像比赛技巧也没有很大的进步。甚至越来越差。不知道路在何方。周六就考noip了,命运之钟沉重的敲打声越来越清晰,而心底那份焦虑与浮躁也开始逐渐膨胀。
一直在告诉自己,上课就要保证质量,无论何时都应该在思考,思考性质,思考原因,思考下一步的行动,思考可能的情况,思考解决问题的方法。
看到那些dalao们的回忆录,心中也常常涌现与他们所共情的感动,然而我也只是想要获得一个省一罢了。跟他们宏伟的志向相比,弗如远甚。然而即便如此,如今的我想要追逐那目标,都有些畏惧,我怕我第一题都不知道怎么写,我怕我出了什么细节错误爆零,我怕大家都发挥的很好,只有我出了差错,我怕成为一场可笑的悲剧。
常常觉得自己小丑,也常常开玩笑,但是内心从深处而言,却是不想输。
只希望接下来的每场比赛都能尽力去打。同时不断纠错吧。
11.14
今天两场比赛都考的不是很好。
上午看第一题很久也没搞出来,然后去写后面的暴力,最后一题的暴力其实也会写,但是意识到要写最后一题的暴力要花很多的时间,得的分也很少,于是选择了放弃第四题的暴力。转而去做第一题和第三题。但到最后也没多得一分。
下午的板子赛使我意识到并查集和差分约束算法,我依旧没有很掌握住。
也许明天依旧如此,也许并非如此。但无论如何,尽力即可。无需因为他人的脚步加快而着急,一步一步跟着自己的节奏走。因为别人会了某道题,不代表你也就会了某道题。只有自己平静地走,才能走出一条出去的路。
11.15
早上考的不是很好。
下午补了补题。
晚上去打球了。
吃完热干面回来的路上,不知怎的想起今天中午的梦,很奇怪,到了一个陌生的地方,应该是一个法庭,然后坐在观众席,被告人是个大叔,然后在判决下来的时候忽然起身拿出枪朝我开了一枪。
然后我被吓醒了。想起那枪口正对自己的时候,还是会很紧张。
11.16
我祈祷,勿为故扰。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具