12.1 省选训练总结

来源:互联网 发布:万宝宝 知乎 编辑:程序博客网 时间:2024/05/29 04:22

题目

  • 点分治
完成情况 题目 出处 Tree POJ 1741 权限题 Race BZOJ 2599 [IOI2011] AC 聪聪可可 BZOJ 2152 AC D Tree HDU 4812 Amaz1ng Prime CDOJ 1562 采药人的路径 BZOJ 3679 Attack and Defence Osipovsky Cup 2014
  • Splay
完成情况 题目 出处 AC 普通平衡树 BZOJ 3224 Tyvj 1728 AC 宠物收养所 BZOJ 1208 [HNOI2004] Book 书架 BZOJ 1861 [ZJOI2006] 永无乡 BZOJ 2733 [HNOI2012] Army Formations HDU 6133 AC 文艺平衡树 BZOJ 3223 Tyvj 1729 Cards Sorting Codeforces 830B (#424)

点分治:

点分治通常是来解决那些在树上统计路径的问题,比如说统计有多少条长度为K的路径等等。如果用暴力,那么复杂度就是n2×gn,其中gn是求lca的复杂度。那么哪怕用tarjan,这个总的复杂度也是n2的。这时候我们需要用到点分治。那么对于一棵树,我们先找到它的重心,然后再以重心为根,那么这时路径分为了两类,一类过重心,一类不过,我们只统计过重心的,然后不过重心的递归处理。由于我们是一棵子树一棵子树的处理,就可以用一个数据结构来维护答案,这个结构可以是线段树,平衡树,甚至是桶。这步只要做到nlogn及以下一般就可以。此时总的复杂度再在此基础上乘上logn

例题:

  • Tree(poj 1741):

很明显是点分治,我们先把到重心的距离排个序,此时就可以二分出来有多少条小于K,设有M条,此时可得到总的条数是M2(之所以没除二是因为这道题把A>BB>A算成了两条路径,如果题上求路径时把A>BB>A算成一条路径,就要除二)。但是这样子会多算,会有在一颗子树上的两个点被选,所以此时我们应该减去重复的。也很简单,把子树的条数:算出来,然后减掉就可以了。

  • bzoj2599 [IOI2011]Race:(IOI的题哦~~~)

他只让你求一条路径,所以我们大可以用一个map,表示当边权和值为K时的最少条数是多少,是哪个点,这样子就可以只要遇到一个点,就看存不存在对应的点,然后更新答案。

  • bzoj2152 聪聪可可:

大水题,就只用那个桶记一下。将mod3的余数开一个桶,直接查。

  • hdu4812 D Tree:

注意这道题是点权。所以处理时不要忘了乘上重心的值。那么这道题我们扫到一个点N,其点权为Q,那么我们需要查K×inv[Q×]是否存在。这里inv是指相对于MOD的逆元。(此题MOD是质数,可以先把逆元筛出来)

  • CDOJ1562 Amaz1ng Prime:

我们这道题记一个桶,那么tong[i]=tong[1]×tong[i1]+tong[2]×tong[i2]+...+tong[i1]×tong[1]。那么减去重合除以二后就是答案了。这是个卷积,就要用FFT

  • bzoj3697 采药人的路径:

首先,如果到这个点的路上有0点,并且这个点有匹配,那么就是可行的。所以,基于此,我们这样分类:如果到这点是0。那么如果路上没有0点,那么就可以其他0匹配。如果有,自己到重心还有一条。如果到这点不是零。如果没0点,就只能与有零点的匹配,反之,可以与任意匹配。所以就这样。

  • Osipovsky Cup 2014 Kovrov, Sunday, December 21, 2014 Problem A.Attack and Defence / FJOI 2016 某道题

设左括号为1,右括号为1。一个合法括号序列分成两部分后,左边部分在任意时刻都大于等于0,右边在任意时候都小于等于0。所以,我们就可以这样判断有多少匹配了。

Splay:

(前几题都是基础,见我另一篇博客:传送门)

  • bzoj2733 [HNOI2012]永无乡

这是明显的treap啊
这道题主要是如何合并两颗splay,我们可以模仿并查集的按大小合并,每次把小的移到大的上,这样子,做多logn次合并,所以总复杂度就是nlog2n。(平衡树本来的复杂度乘logn

  • hdu6133 Army Formations

一样的,启发式合并。注意加入一个点产生的贡献是(+1)×。所以我们可以把他加入根后把答案加上(+cnt)×。然后暴力更新左子树。这样子看似复杂度高,实际上只有nlogn

  • 洛谷3372 【模板】线段树 1

类似线段树打标记。只不过我们在splay的时候,可以把它到root的点暴力拿出来,然后暴力的下放标记。

  • Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) B.Cards Sorting

很简单,用一颗splay模拟,每次先将最小的找出来,splayroot,此时答案就是左子树的size,然后把左右子树互换。

原创粉丝点击