BNU2017校赛

A(模拟)

题意:求一个特殊图的最大流

分析:画画图发现就是for循环扫一遍

B(LCA)

题意:有n个点组成的树,有q个询问,每个询问(A,B,C),学生从B点走最短路径走到C点,再从C点走到根节点1,问老师从A点出发,能否拦截到学生。

分析:

  设u=LCA(A,lCA(B,C))

  那么如果A->u的距离小于从B出发走到u的距离,那么就能拦截

      如果距离大于,那么不能拦截

      如果距离等于,要判断此点是否在根节点,如果在根节点,那么要判断老师和学生是走一条链上来的还是两条链上来,如果是走一条链上来就能拦截住,否则不能拦截住;具体判断方法就是求下LCA(A,C)

C(模拟)

=w=

D(竞赛图性质)

题意:所有由n个点的竞赛图中,问最长链分别为1、2、3....n的有多少种

分析:

  暴力构造竞赛图,暴力求最长链

  然后会得到一个神奇的结论,竞赛图中必存在哈密顿路,最长链就是点数

E(三分/数学)

题意:给你一个三角形,以每个顶点为圆心画圆,要求这三个圆互不相交(但不能内含),而且圆的半径可以为0,求这三个圆的面积和的最大值

分析:

  先肯定猜三分,然后输出方案会发现必有一个是0……

      然后就只要考虑两个圆相切的情况

F(计算几何)

待填坑

G(状压dp)

待填坑

H(splay+bit)

题意:n个人有各自的编号,也有各自的排名(排名1~n),排名>0.6*n的人得到安慰奖

   有两种操作:

      op1:给定x,y,把编号为x的人的排名提升到第y名,原本排名>=y的顺次降低一个排名

      op2:给定x,y,问编号在x~y范围的人中有多少人得到安慰奖

分析:

  如果某个人得到安慰奖,那就用1表示,否则用0表示,那么x~y内得到安慰奖的人数就可以用区间和来表示

  注意到一次操作1,顶多改变2个人的01值,所以这完全可以用树状数组来维护

  至于排名,则可以用splay来维护

  所以splay+bit就可以了

  这题由于数据比较小,分块其实跑得更快

  分块按照排名分块,每次提排名操作必然会导致块的大小的不平衡,所以有个好方法就是每隔根号n次操作,重新构一次块

I(网络流)

待填坑

J(kmp)

题意:给定一个字符串S(|S|<=2000),考虑它的任意一个前缀pre[i],任意一个后缀suf[j],找到pre[i]的一个最长后缀B正好是suf[j]的前缀,那么pre[i]=A+B,suf[j]=B+C,定义这样的f(i,j)=|A|*|B|^2*|C|,求所有f(i,j)的异或和

分析:

  枚举每一个后缀,再枚举前缀,快速求得|B|就能解决问题

  然后我们发现,这样的一位一位去枚举前缀的过程,实际上可以用这个后缀和原串S做kmp来代替

  所以就是提前预处理出所有后缀的next[],然后枚举后缀和原串做kmp,就可以得到每对(i,j)的值了,把他们异或就行了

K(模拟)

QvQ

posted @ 2017-04-26 15:31  Chellyutaha  阅读(210)  评论(0编辑  收藏  举报