zoukankan      html  css  js  c++  java
  • csps考前的一些总结(然而可能并没有用)

    记录考前的一些复习和总结,如果没有特殊情况不再写新的题解了

    图论:

    一.最短路:

      1.spfa算法中的vis数组记录的是有没有入队,防止多次入队,通过松弛操作来达到最优解

      2.dijkstra算法的vis是记录是否出队,也就是说根据贪心的过程,我们在优先队列里可能会多次放一个点

      但是我们只需要用距离最小的点来更新,其他入队的相同点不能更新来保证时间复杂度

      3.对于一些特殊的题需要求到某个点的第d小路径,我们只能用dijkstra+堆来维护

      因为我们对于$x->to$的更新必须保证x已经更新为最优解,然后注意vis数组需要用

      对于每个点用堆储存他的d+1小值,更新完后的堆首就是答案  

    二.欧拉路

      1.判定细节:对于欧拉路,有向图中出度-入度==1-1的点各有一个,其余入度==出度

                  无向图中度数为奇的点有两个,其余为偶

            对于欧拉回路,有向图所有点入度==出度

                     无向图度数均为偶

      2.实现:可以用手工栈+当前弧优化,

        st[++top]=qidian;
        while(top>0){
            int x=st[top];int i=head[x];
            while(i&&vis[i])i=e[i].n;
            if(i){
                ++top;
                int to=e[i].to;stb[top]=id[i];vis[i]=1;
                if(T==1){vis[i^1]=1;}
                head[x]=e[i].n;
                st[top]=to;
            }
            else{
                ans[++ans[0]]=stb[top];
                top--;
            }
        }

    数据结构:

    一.单调栈队列:

      1.常用于O(n)判断一个点的前趋最大和最小值。

      2.在单调队列中记录last数组可以记录在栈中某个点到他的前面一个点的相同值的个数。

      3.单队判重可以结合hash表。见于csps测试102

      4.单队用于查询两点大于等于区间最大值的点对个数,见于csps测试102。

    基础算法:

    一.二分:

    一些问题模型:

    一.已知a,b序列,a序列可以改变位置,求a>b的个数最大值

    解法:1.如果只是问答案,可以用各种贪心,或线段树水过

      2.如果输出字典序最大、小序列,考虑线段树套二分,每一位的两个区间满足单调性,可以二分并在线段树中log维护信息,复杂度$nlog(n)^2$。

    二.求序列$a_{i}-a_{j}$,满足$i<j$并且$a_{i}*a_{j}$为完全平方数的个数

    正解:$n*sqrt[3]{n}$

    考虑用平方因子去筛数字,然后用假设剩下的为$p*p*x$

    那么$x< sqrt[3]{n} $,一定被筛掉,或者$p==1$,那么x就是若干质数的

    乘积,然后就可以直接筛

    三.求$m$个边,其中$u-w-v$不是三元环且相连,求$w_{u}*w_{v}$的和,最大值

    求和:比较显然。因为只有m个边,那么只须对于每个点作为$w$,加上三个点的贡献,再减去三元环的贡献

    求极值:证明$m$个点最大有$m*sqrt{m}$个三元环。

      假设我们将点按他的度数排序,每个点去匹配比他度数大的点。然后对于当前点v假如当前度数大于$sqrt{m}$

    那么只会有$sqrt_{m}$节点被扫到,如果小于,那么也是小于根号。

    然后将每个点的相连的点按val排序,然后枚举每个u,没找到一个v就break,

    这题暴力90?????

    四:求d维网络中给定几个坏点无法经过,求原点到终点的路径数。

      考虑容斥。

      设$f_{i}$表示从原点到i的不经过坏点的路径数,根据维数的信息可以建出转移的拓扑图来

    然后每次枚举每个转移点作为坏路径的第一个坏点,$f_{i}=f_{i}-sum_{j}f_{j}*cal(j,i)$.

    考试的注意事项:

      1.考试时如果T120分钟内没有思路就赶紧过或者打上暴力,不要浪费过多时间

      2.多测一定要清空,尤其是图论题,一定要把存边的接表或vector清空

      3.一定要读清题后再去思考,最好先模一遍样例

      4.取模看清模数!!!!!!!

      5.要测极限数据,1LL<<63!!!

              

  • 相关阅读:
    Vue.js中css的作用域
    vue搭建脚手架
    一对多,多对一关系映射
    java.time.format.DateTimeFormatter
    java.time.ZonedDateTime
    Akka(23): Stream:自定义流构件功能-Custom defined stream processing stages
    Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub
    Akka(21): Stream:实时操控:人为中断-KillSwitch
    Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering
    Akka(19): Stream:组合数据流,组合共用-Graph modular composition
  • 原文地址:https://www.cnblogs.com/Wwb123/p/11799410.html
Copyright © 2011-2022 走看看