总结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。所以,多看数据范围是有好处的。**

相关