济南QBXT7月自闭游记

Day -1

一觉睡到上午十点~~ 爽!!!

然后开始看番,\(emmm\),西片太太的狗粮真好吃,饱了饱了~

下午接着看番吃狗粮,大概两点开始钢文化课作业,三点不知道为什么又开始看番,四点时想到要去集训了,于是找道题练练手感。

从四点到六点,15分钟敲完了树剖加线段树,然后调了两个小时,最后发现\(A\)数组与\(a\)数组混了。。。心态爆炸\(ing\)

晚上匆忙想起来要收拾行李,结果光荣地把身份证忘掉了。。

然后滚粗睡觉去了。。。

Day 0

早上起来赶车,因为怕晕车什么东西也没吃,到了等大巴车的地方,大巴车竟然迟到了!!顺便,等车的地方,味道一言难尽。。。

老师专门说了,不让带手机,虽然我还是带了,嘿嘿嘿。车上不敢太放肆,只敢戴着蓝牙听听歌,然后中间服务区维修,所以一路就到了济南,我也不知道一路上怎么过来的。。。

来了办理住房,因为没带身份证慌得一批,最后发现竟然可以办理临时的。。

\(SB\ old\ horse\) 一下午换了三次房间!!最后还是和\(old\ horse\)住一个房间!!我佛了。。。

不过,原则不能变!!晚上该\(high\)还是\(high\),一点滚粗睡觉,\(emmm\)

Day 1

还是一样的地方,不过到餐厅晚了,面包居然没了,还没有牛奶!!差评!

上午听一些极其简单的基础算法,老师说低估了我们的水平,中午要回去备一些难题,忐忑。。顺便,老师的口音真的是……

中午对面吃饭,\(emmm\),米线真好吃,除了有点贵。。

回房间小睡一会,醒来听到\(ziiidan\)惊呼,迟到了,看表发现\(14:01.\)。下一秒收到了\(old\ horse\)的电话。。满头黑线

果然挨了一顿批,唉~~

下午听搜索,爬山算法\(and\)模拟退火,一愣一愣的,可能是老师码风太神仙。。膜拜爬山算法解决八皇后问题

下午出去转,来的次数太多,卖冰激凌的阿姨已经认识我们了。。不过,奶昔确实不错,\(emmm\)

晚上回来调题,仍然是半个小时写完树剖加线段树,然后。。又调了两个小时。。最后把从\(0\)开始建树改成从\(1\)开始建树就\(A\)了!!怀疑人生\(ing\)

晚上回房间继续\(high,perfact\)

Day 2

突然发神经的\(old\ horse\)要求\(6:30\)起床,结果到时间他还在打呼噜。。。到得早餐厅居然还不开门,多等了十分钟。

上午听启发式搜索,\(A\) $* \(感觉还可以,听得懂倒是听得懂,代码还是有点问题,老师说\)IDA$ $* $ \(NOIP\)基本不考,所以也没有多提,也就不再过多去想。

剩一个小时讲莫队,之前一直想学的一个算法,好吧,原理真的很简单,代码看起来就比较恶心,唉~多写写吧。

下午讲一些神仙东西,整体二分和\(CDQ\)分治,非常玄学,感觉上像是听懂了,中午睡的一个小时感觉效果还不错,虽然一愣一愣的,但好歹算是听懂了。

老师还准备了点分治。。。。听的话感觉会当场阵亡吧。。。。。

晚上写\(CDQ\)分治板子题,发现样例过了然后十个点全部死循!!!又调了两个小时。。心态崩溃,最后发现\(cnt\)写成了\(n\),滚粗写莫队去了~~~

深夜,看番吧,\(emmm\)

Day 3

上午沙雕模拟。。写一下题解吧。。。

T1

沙雕二分题。。

小鸟喜欢吃糖糖!
小鸟有 n 张椅子,从 1 到 n 排成一排,每张椅子上坐了小鸟或是一个琴梨。
小鸟还有m 块糖,琴梨们和小鸟都想要吃糖,可是她们的吃的糖数不可以比任意与她们相邻的人少超过 1。
小鸟喜欢自己的椅子,所以小鸟一定坐在在第 k 张椅子,自然而然地,剩下的椅 子就要给琴梨坐啦。
请问在每个琴梨都有糖的前提下,小鸟最多可以有几颗糖。
数据范围为1e9

很明显的二分策略,直接二分小鸟的糖数,那么小鸟的左右两边就分别构成了两个公差为\(-1\)的等差数列,按照求和公式计算,看最后的结果是否在\(m\)之内,唯一需要注意的细节是每一只琴莉都要有糖吃,所以当等差数列的一项小于一时,直接累加后面的项数即可,即后面每只琴莉一颗糖。

还有一种推数学公式的方法,不过我没想,也懒得想。

期望得分:\(100\) 实际得分:\(100\)

T2

沙雕莫队题。。

小鸟喜欢莫队算法!
小鸟给你 n 个花的颜色,这 n 个花排成一排。
小鸟会给你 m 次询问,每次询问一段区间[l,r]中,颜色最多的花是有多少个,请你帮帮小鸟吧!
数据范围n为5e4, m为1e5.

好吧,题目里写得很明显只是一道莫队题。

\(40\)分做法

直接暴力,不多\(BB\)

正解

莫队套权值线段树,考试还剩半小时时\(YY\)出了这个解法,然而对代码实现能力极其没自信的我在线段树和随机全排列间果断选择了后者。。后来发现\(ziiidan\)\(12\)分钟码完了这个,我也该去敲的啊,啊啊啊啊

这道题的难点其实在于区间转移时收缩的操作,就例如从区间\(1\ 2\ 1\ 2\)向区间$2\ 1\ 2 \(收缩时,最大值的转移会比较困难,考试时也想到了这一点,卡在这里很长时间,一直在魔改莫队。。最后半小时幡然醒悟,\)TMD$直接用线段树维护然后直接统计不就好了嘛!然而没有写,魔改了一番莫队就提交了。

(中途老师一直在缩短时限想把暴力卡掉,但最后A的人还是写的暴力。。。跑的还贼快。。gsj大佬暴力70,我为什么没写暴力,啪

期望得分:\(70+\) 实际得分:\(10\) 兼容性炸了,呜呜呜呜

T3

沙雕提答题。。

考场上第一道提交答案题。

这是一道ᨀ交答案题。
小鸟是一名优秀的理论计算机科学家,她想要让你研究一下 TSP 问题。
旅行商问题,即 TSP 问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访 n 个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
现在小鸟给你平面内的 n 个点的坐标(x,y),让你求一下这 n 个点的一个 TSP。
但是丧心病狂的小鸟不会问这么简单的问题,她发现如果你的路径上的第 k 个点的编号是一个质数的话,那么最终你的总的路径长度会减少这个质数。
点的编号从 1 开始,路径上的点的编号也从 1 开始。
【输入格式】
输入数据有 10 个文件,为 c1.in~c10.in。
每个文件第一行为两个正整数,为 n 和 k。
接下来 n 行,每行两个正整数,为每个点的坐标(x,y)。
数据保证 k≤n。
【输出格式】
你需要ᨀ交 10 个文件,以 c1.out~c10.out 命名。
每个文件输出一行,为 1 到 n 的一个排列,表示你走的顺序。
【评分规则】
本题共 10 个测试点,每个测试点 10 分。
如果你的输出不合法,该测试点得零分。
如果你的输出合法,并且这条路径的总长度是l,且标准答案给的方案的总长度是l_std,那么你会得到min(l_std/l, 1.2)*10的得分。意思是说,你在这道题目可能会获得比 100 分更高的得分,最高可以获得 120 分。

关于这道题的题解不想写太多,毕竟他很沙雕。。

20pts

很简单的一个\(dfs\)

40pts

比较好的\(dp\)做法。

正解

貌似是分块!??

草率结束,咳咳咳

考场写了一个随机的全排列,直接提交,然而人品大爆炸。。只拿了\(9\)分,\(gsj\)大佬\(14\)分吊打我,\(TQL\)!!

期望得分:玄学 实际得分:\(9\)

本次测验 :\(100 + 10 + 9 = 119\)

果然爆炸。。滚粗回房间去了~~~~

下午钟皓曦大佬讲一些比较简单的数据结构,\(emmm\),还可以,不过随机化算法是真的强。

\(rand\)后的并查集竟然比\(rand\)前还慢!!再也不会相信概率了\(QwQ\)

买彩票,啪!!

晚上\(old\ horse\)出去转,\(WDNMD\),写题去了~~~~

Day 4

彻底自闭的一天……

上午讲堆, 树状数组,线段树……,然而都懂,百无聊赖的我于是去写了篇题解~~~~

膜拜钟皓曦神仙的线段树码风,透露出一股浓浓的大佬气息,决定有空学习一下。

下午是自闭的开始\(……\)

二叉搜索树,\(Treap\)\(Splay\),发现前一天晚上睡得有点晚,稍微有点迷,但思考一下还是能懂的。

晚上试着用\(Treap\)来做线段树\(1\),然后发现代码调试了\(3\)个小时,最后提交发现玄学MLE,一直卡\(30\) \(……\)

不想说什么,滚粗回房间了~~

Day 5

上午讲什么。替罪羊树!!神仙东西。其实就是不需要旋转,通过一些其他方法强行平衡的\(Treap\)。感觉现阶段用处不大……

然后讲了一个极其\(NB\)的东西,可持久化\(Treap\),代码比\(Treap\)短,不需要旋转,简洁易懂,除了常数比\(Treap\)大一丢丢\(……\)
\(Treap\)还有什么存在必要呢!??zhx:因为他出现的早.
\(WDNMD\)!!然后想起昨天晚上调了一晚上\(Treap……\)我TM一晚上调了些什么啊!!!

下午讲了好多毒瘤题\(……\)一下午讲完了一个月的题量\(……\)什么神仙东西!!!

晚上调\(Fhq\ \ Treap\),发现\(zhx\)神仙代码依然有错。。。内心充满\(mmp……\)

Day 6

上午讲一些毒瘤的数据结构题目,昨晚看番看到很晚,所以上午状态就不太好。。然后当他讲到一道需要用线段树维护6种不同的前缀和之后,就彻底被打垮了。。然后开始水犇犇~~ 嘿嘿嘿

下午照常模拟,很毒瘤。。。

T1

众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。

现在有n个数a1, a2, ⋯ , a_n,你可以做无限次操作,其中每次操作你可以将最后一个数a_n放到序列的最前面变成a_n, a1, ⋯ , a_n−1。

这样的话你可以反反复复通过这样的操作得到很多个不同的序列,问这些序列中逆序对数量最少的序列有多少个逆序对?

对于30%的数据,n ≤ 100
对于60%的数据,n ≤ 1000。
对于100%的数据,n ≤ 1e5,读入的序列一定是1~n的排列

这道题在考场上做的还比较顺利,大概\(10\)分钟\(YY\)出了正确解法,然后花了半个小时调试完毕。这道题首先将序列复制一倍,然后维护\(1\sim n\)的逆序对个数,然后\(O(n)\)扫过去,但我采用的是滑动窗口一样划过去,采用树状数组维护。结果讲题时老师告诉我这道题有特殊性质:\(1\sim n\)的全排列,所以每次更新答案时,直接\(-(n-x)+(x-1)\)即可。。。

期望得分:\(100\) 实际得分:\(100\)

T2

众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。

n个数,m次操作,修改操作为将一段区间全部加上一个数v,而询问操作会

给你一个数????和一段区间[l, r]。现在从这段区间里面选k个数乘起来,问所有方案的和是多少。

对于20%的数据,n, m ≤ 50, k ≤ 3。
对于40%的数据,n, m ≤ 1000。
对于另外20%的数据,k = 1。
对于另外20%的数据,没有修改操作。
对于100%的数据,1 ≤ n, m, v ≤ 105, 1 ≤ l ≤ r ≤ n, 1 ≤ k ≤ 5。

线段树毒瘤题目。。。。

这道题难点其实在于推数学公式,上公式:

\[ans =\sum_i^n\sum_j^{i-1}\sum_k^{j-1} v^3 * (a_i+a_j+a_k) + v^2 * (a_ia_j + a_ja_k+a_ia_k) + v \]

推出这个式子后直接将其带入线段树求解即可。

考场上\(YY\)了一个\(O(n)\)的式子:

\[ans = \sum_{i=l}^r a[i] * \sum_{j=i+1}^r \]

发现样例是过的。。。然后它炸了。。

期望得分:\(60+\) 实际得分:\(20\)

T3

又一道沙雕的提交答案题。。。

具体来说,对于每个数据点,你都会有一组数据的输入和输出。我们保证,这组数据的输出是利用输入通过某种数据结构的操作得到的结果(例如,一组数据可能是用一个单点修改区间求和的线段树得到的输出)。

但现在的问题是我们并没有告诉你对于该测试点我们所使用的是什么数据结构,你要做的事情便是根据给定的输入和输出猜出每个测试点所使用的数据结构,然后再将这个数据结构应用到另外一组输入数据上,得到输出的结果。

对于每个测试数据点,我们会给你三个文件,分别为 sample.in、sample.out和 structure.in。(这里每个测试点应该有它自己的编号,我们为了方便描述将其省略)其中 sample.in 为给定的输入,sample.out 为这个测试点对应的操作方式所得到的输出。

我们希望你对 structure.in 做同样的操作,你需要提交的是对 structur做同样的操作之后得到的 structure.out。在 sample.in 和 structure.in 中,第一行的前两个数一定是N, M,N是一个和序列长度有某种关系的数,而M是和操作数目有某种关系的数。如果第一行有三个数,则第三个数代表要将答案对哪个数取模。

接下来一行会有若干个数(和N有关),代表一开始序列里面的每个数。(这一行也有可能不存在)再接下来会有若干行(和M有关),每行代表一个操作。其中每行的第一个数代表操作的种类。如果这个数是1则一定是询问操作,否则一定是修改操作。

需要注意的是,所有测试点,在正确猜测到所对应的数据结构的情况下,都不需要高精度。

第一眼看到这道题时,内心是慌乱的实际上后来也是慌乱的什么东西!??这\(TM\)怎么猜??

然后试着看两个测试点,发现只要认真想想就能看出来是什么数据结构,然后一路推到第九个点,然后直到考试结束都卡在第九个点。。。。

说一下十五个点的数据结构:

@1 数组,单点查询~~老师在黄金分割比处改了一个数,输出1N直接爆炸。。。~

@2 单点修改,单点查询

@3 单点修改,区间查询

@4 区间修改,单点查询

@5 区间修改,区间查询

@6 队列

@7 栈

@8 堆 优先队列

@9 号称所有点中最难的一个那为什么放这里。。

单点修改,查询\(\sum_{i = 0}^r a[i] * v^i\)

@10 查询区间第k大

@11 区间异或,查询区间异或和

@12 线段树 \(ax+b\) 线段树2

@13 单点修改,查询单点的k次方

@14 查询区间不同元素的个数

@15 区间反转,求和

期望得分:\(48\) 实际得分:\(42\)

所以下午要做\(17\)道数据结构!??\(WDNMD\)

总分: \(100+20+42=162\)我好菜啊

最后竟然\(rank ~ 1\) !!

没有机械键盘差评...

回房间看番去了~~~~

Day 7

本来课表上安排有可并堆的讲解,但\(zhx\)神仙说:那东西完全可以用\(Fhq\ Treap\)\(merge\)操作代替。。。

上午讲题:首先致命三连:

查询区间内不同的数的个数

查询区间内出现两次数的个数

查询区间内出现次数为偶数的个数

全部强制在线

第一问其实用莫队处理很简单,但\(TM\)强制在线,所以做法是开一个数组f记录最近之前相同数的位置,然后查询时f值小于区间左端点的即为答案。

第二问采取与第一问类似的方法,但我们记录至少出现两次和至少出现三次的数的个数,前者减去后者即可。

前两问的方法对于第三问完全不适用,所以我们采取分块的方法,\(f[i][j][k]\)表示第i块到第j块出现k次的数的个数,\(g[i][j]\)记录答案,但这样很明显空间复杂度为\(n^2log(n)\),所以我们做一些优化,让\(f[i][j]\)代表第i块到第j块的可持久化线段树,这样空间复杂度降为\(n \sqrt{n}log(n)\),时间复杂度为\(O((n+m)\sqrt{n}log(n))\).

毒瘤题目:

树有点权

定义树上有向路径权值为路径所有点权组成的k进制数模p

P是质数

定义f(p1,p2)=[v(p1,p2)=r]

问多少三元组满足

f(p1,p2)=f(p2,p3)=f(p1,p3)

将其转化到图论上,求的其实是同色三角形的个数,但这比较难算,所以转化为求异色三角形的个数,那么总共有六种情况,最后用\(n^3\)减去所去左右情况数即为答案,但很明显我们会重复计算一倍,所以最后的情况数要除2。

\(out[i][0/1]\)表示从\(i\)出去的\(0/1\)边的个数,\(in[i][0/1]\)自然表示进入的\(0/1\)边的个数,那么答案为:

\(ans=n^3 - \frac{2*out[i][0]*out[i][1]+in[i][0]*out[i][1]+in[i][1]*out[i][0]+2*in[i][1]*in[i][0]}{2}\)

但很明显我们在预处理\(out\)\(in\)数组时,时间复杂度接受不了,所以我们采取树分治来解决,因为他可以处理很多条链的情况,然后代码可能比较难写。。

还有一道很毒瘤的逆序对改进题,题面很鬼畜,所以就不写了。。。

下一道:

n个节点的数,m次操作。
1 查询以p为根的子树中有多少个整数
2 以p为根的子树中所有数-v

首先这道题全部是子树上的操作,所以我们用\(dfs\)序将其转化为区间上的操作。

因为每次都是减法,所以一旦一个数减为负数,那我们就没有必要在对其进行更新,那么在每个数减为负数时,我们对其进行一次暴力修改,因为每个数只会被修改一次,所以复杂度还是\(O(nlogn)\)

下一道:

题目链接

将水平线划分成一个一个格子,然后我们发现落到每一格上的面积呈递增趋势,所以就转化为区间加等差数列,区间求和。

next:

题目链接

奇奇妙妙的解法。。。

还是用线段树来维护每个区间内有多少个数比前面的数都大,问题在于左右两个区间的合并上。

我们在每个区间中找出的数都是单调递增的,所以左边的最大值肯定比右区间前面一段数要大,所以我们用二分来求这一段数的个数,但我们需要维护出这个单调的序列。

因为线段树本就是二叉树,所以我们直接在线段树上二分,根据\(l.max\)是否\(>pl.max\)来决定向左或向右。

上午就这样了。。。

中午收拾收拾东西,下午回家喽~~~

总结

这次集训还是发现了自己的不少问题,代码实现能力弱,有时候思路模糊,太弱了 等等等等。。。不过也算有所进步。

距离\(NOIP\)还有\(100\)天,省选估计也挺快的,祝自己\(RP++\)

大家一起加油吧!!

posted @ 2019-10-25 11:42  Hydrogen_Helium  阅读(241)  评论(0编辑  收藏  举报