zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    laravel一对多
    laravel如何使用软删除
    java如何使用scanner
    java实现99乘法表
    git commit -am '本次提交描述'与 git commit -m '本次提交描述'
    django-pip安装
    pip切换阿里云镜像(国内镜像)
    [leetcode] Divide Two Integers
    [leetcode] Remove Duplicates from Sorted Array
    [leetcode] Remove Element
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6768867.html
Copyright © 2011-2022 走看看