总结20170317那一周
这是笔者当时的总结,部分东西过于naive,敬请理解。
近来,考了几套NOIP真题,另外伟大的斯堪福·胡也给考了几道,余以为甚为有趣。之前已经写了一些总结,但总还认为不够。
20170317 |
Math (mhy12345) |
Sequence 0 |
Calc 100 |
Cube 0 |
|
20170318 |
Data Structure (idy002) |
Rotinv 60 |
Rise 0 |
Seqmod 30 |
|
##**20170317 Math(mhy12345) **
Sequence是一道很有趣的题,单峰队列……
因为不好画图,请自行脑补……
当时,看到这道题,整个人是蒙蔽的。画了一下图,模拟了几组数据,才明白题意。**所以,稍微多花一点时间审题,真的是很重要的。**
**另外,不得不说,此题的样例太水了,实在是太水了。(所以说,样例对了并不能说明你真的看懂了这道题)**例如,我开始时猜了几种通项公式,结果统统否定了。话说这种题,不求通项O(1)求解简直是无稽之谈。
直到最后,我才发现,居然就是……
2n-2
当时,我半信半疑(事后推了出来),但还是用了,只不过long long×long long爆了……
** P. S. : lmy说,laekov是一名人称“何家坳”的稀有生物……**
Calc就是求逆元。
这里稍微总结一下求逆元的方法。
Cube这道题啊,很有价值(超立方体可以让人大开眼界)。
它的递推公式相对好推,但通项公式的确难懂。
但是,仅仅如此还是不够,得加上线性筛。幸好有中。
##**20170318 Data Structure(idy002) **
Rotinv这道题可以让我们深度理解**树状数组**。因为n个序列中,可以轻松算出任意两项的先后位置关系,之后便能写出前缀和数学公式,套上树状数组。
**但是,此法不算最优,因为开了两倍空间。而且,注意,这类题目 long long要多开(为此WA40分)。**
Rise很有趣,因为我们可以不用线段树。
点与点之间有一些next的关系,中间的可以直接跳过。
** next[i] = min{ j | aa[i] < aa[j] 且 i < j }**
readin(n);readin(m);
for( int i = 1; i <= n; i++ ) readin(aa[i]);
for( int i = 1; i <= n; i++ )
for( int j = i+1; j <= n; j++ )
if( aa[i] < aa[j] ) {
next[i] = j;
break;
}
while( m-- ) {
readin(L);readin(R);
int now = L, ans = 1;
while( next[now] != 0 && next[now] <= R ) now = next[now], ans++;
printf( "%d\n", ans );
}
这与题目的性质有着极大的关系。**lmy说,这叫跳跃表。但是,考试时我打的有小问题,便WA完了。**
我大概没有权力来讲第三题。
Seqmod是有序链剖,当时丁神讲过。当时并不觉得有多稀奇,但**lmy说,idy002当时做BZOJ3999时,想了很久,始终认为链剖必须有序,便开创了一种新算法。**
确实,网上查不到**有序链剖 **。而它与“无序链剖”最大的区别即是不用swap。在普通链剖中,swap是处理深度不同时的“必要”措施,但在此题下,一切都必须有序。我们需要引入更多特判,但思路依旧很清晰。*
**考场上,没能打出来,便写了DFS暴力,依旧30。所以,多看数据范围是有好处的。**