2019CSP考前总结

易错点以及技巧:

1、忘删调试信息

2、没开longlong,一些爆longlong的题没有与INF取min

3、求SCC应该把sccno赋成scccnt

4、矩阵乘法把mod写在第二层会快很多

5、写高精度错误估计了位数

6、注意读题:路径是点不相交还是边不相交

7、写完高精度一定要手造大样例,并考虑是否压位

8、高精度压位时注意输入输出的变化(还有数组大小)

9、注意读题:输出的答案到底是什么东西

10、搜索时(如果可以交换顺序)注意先算比较容易确定的点(看实际运行时间吧。。。)

11、注意while的边界

12、有时一些函数可以直接求到极值点,但是要同时验证端点

13、尽量先想简单的方法解题

14、树链剖分时要把siz初始化为1!!!否则会TLE!!!小数据根本看不出来(或者可以手造大数据测一下(1000以内对拍正确性)(100000估算时间复杂度)(想方设法把自己卡ToT))

15、构造转移矩阵的时候注意手动验证自己矩阵的正确性,注意初始矩阵

16、环形均分纸牌:

if(T%n==0){
    int tmp=T/n;
    for(i=1;i<=n;i++)
        cntx[i]=cntx[i-1]+cntx[i]-tmp;
    sort(cntx+1,cntx+n+1);
    for(i=1;i<=n;i++)
        ansx+=1ll*ab(cntx[(n+1)>>1]-cntx[i]);
}

17、一些爆搜题可以转为图论来做会让爆搜更简单

18、求a/b在c进制下的混循环节:

(技巧(常识):,假设a/b是最简分数,则M是混循环长度,R是纯循环长度)

然后要做的事情就是把左边的a/b变成右边,可以先求M再把b剩余的因子配成

即找到最小的R使:

移一下项:

由于c和b/gcd(b,c^M)已经互质了,于是可以BSGS,也可以暴力(如果b/gcd(b,c^M)比较小)

先换一下元

如果考虑暴力,由欧拉定理可知

于是可以枚举phi(T)的因数,然后快速幂验证,没了

LL cal(LL A,LL B)
{
    LL x=phi(B),y=x;
    for(int i=2;1ll*i*i<=x;i++){
        if(x%i==0){
            while(y%i==0&&ksm(A,y/i,B)==1)y/=i;
            while(x%i==0)x/=i;
        }
    }
    if(x>1&&ksm(A,y/x,B)==1)y/=x;
    return y;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        LL a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        LL g=gcd(a,b);
        a/=g,b/=g;
        int M=0;
        while(1){
            LL x=gcd(b,c);
            if(x==1)break;
            b/=x;M++;
        }
        printf("%d %lld\n",M,b==1?0ll:cal(c,b));
    }
}

 

19、有一些感觉需要DP的问题可以通过贪心来解决,但要给自己举反例

20、多尝试:逆向思维(删边变加边等),二分答案,转图论……

21、二分图匹配时注意x部y部的点数,x编号1~n,y部编号n+1~n+m

22、一些RMQ问题没有修改就尽量用ST表

23、尽量发现枚举中的单调性,这样可以少一个n

24、一定不要写SPFA,写堆优化Dijkstra(当然不是绝对的,CSP应该不会卡SPFA吧。。。)

25、manacher一定要小心,if(i+1);

26、WQS二分,限制什么的个数就对什么加权!!!!!!!!!(千万不要所有的点都加权啊啊啊啊)

       如果要DP就尽量用结构体来存DP值和已选个数

27、线段树模拟费用流?实际上就是线段树模拟可以反悔的贪心

 

 

28、看到+1-1就尽量往括号匹配、卡特兰数方面想

29、计算有限制的路径方案数一定要从它的本质入手,不要乱推式子、纸上谈兵

30、如果有样例解释的话一定要看样例解释(这样就不用枚举题意了)

31、判断完全平方数不要用sqrt(x)*sqrt(x)==x要int(sqrt(x))*int(sqrt(x))==x

32、考虑全面,想出一个解一定要想方设法hack掉自己,如果hack不掉就是正解了

33、bfs的时候要在入队的时候打vis标记,否则会T(因为出队的时候打标记不能保证转移的过程中没有重复状态,可能重复转移队中的元素)

 

 

34、有些DP看起来不会爆longlong(或int),但在计算途中可能会把多个INF加起来,然后爆掉longlong。。。

35、取模的时候(……)%=mod不要写成(……)%mod !!!!

36、写堆优化Dijkstra的时候一定要把dis前面加负号,不然更新的顺序就是反的,然后T飞。。。

37、带入询问次数m时不要带成n!!!!

38、不要随便缩小二分的总范围

39、DP的时候注意细节,不要随便用总体的值来运算(比如在枚举物品是否选不要用sum-lsum来计算rsum)

40、结构体DP注意比较的优先级,不能用优先级来确定能否转移一个点(有可能它在某一个点的优先级比较高,但是这个点是不能转移的)——来自洛谷的某场比赛T1

41、有向无环图遍历必须打vis!!!(T过两次了。。。)

42、注意是有向图还是无向图,加边一定不要错!!!!

43、注意点边的编号是从0开始还是从1开始!!!!

 

一些想要复习的东西:

1、概率期望DP  √
2、构造DP(求字典序第k大的解)
3、排名DP、数位DP(求当前解的排名)
4、二分图 √、km、网络流、费用流
5、kmp、AC自动机
6、贪心  √
7、带权并查集
8、splay  √、LCT、左偏树  √、KDtree、Trie树贪心 √
9、分块、莫队  √

 

想学的东西:

1、Treap  √

2、李超线段树 ?、吉司机线段树 √

3、后缀自动机、后缀数组

4、杜教筛、min25筛

 

 

考试策略:

1、先仔细审题,如果秒切,先不要急着打,要举几个例子来验证(可以直接证明就更好),敲代码之前一定要保证自己是对的

2、如果没有秒切,先不要慌,心里想着:这道题其实很简单,然后从问题的数据范围入手,先解决小范围数据,步步为营

3、不要想写什么就写什么,也不要不想写什么就不写什么

4、一般前两道题都是比较简单的,不要想复杂了,不要降智,写完前两道题,第三题如果时间够且想出了正解,就直接写,否则就暴力吧

5、考试结束之前一定要检查freopen,文件名,数组大小,各种调试信息有没有删掉,ctime不要用……

6、如果有大样例一定要测

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(总结,总结)