zoukankan      html  css  js  c++  java
  • 【FBI WARNING】一些Noip的黑科技 持续整理!

    有疑问或错误尽管评论!! 
    下面以C++为准。

     本文手(粘)打(贴)于各大博客之间 有问题。。。。。 我也不懂

    max、min的优化

    我们知道,打max、min时,要用分支(if语句)。这样会使程序超慢。

    有没有其他方法?有的。 


    当x<0时 x>>31=-1 (11111111111111111111111111111111) 


    当x>=0时 x>>31=0(00000000000000000000000000000000)

    所以我们可以通过作差,求出谁大谁小。

    int max(int a,int b)
    {
        int m=(a-b)>>31;
        return a&~m|b&m;
    }
    int min(int a,int b)
    {
        int m=(a-b)>>31;
        return a&m|b&~m;
    }

    以max举例, 
    当a>=b时,m=0,所以max(a,b)=a&~0|b&0=a&-1|b&0=a 


    当a< b时,m=-1,所以max(a,b)=a&~-1|b&-1=a&0|b&-1=b

    补上一个abs的优化:

    int abs(int a)
    {
        int b=a>>31;
        return (a+b)^b;
    }

    当a>=0时 b=0 abs(a)=a^0=a 

    当a<0时 b=-1 abs(a)=(a-1)^-1=-a(相信大家都懂补码的转换方式)

    有一点很重要的是,不要乱用!比如不能硬是将int改为long long,注意右移的位数要变!

    手动编译优化

    格式:

    #define x y 

    在程序中,一切出现x的地方都会变成y。 


    可以省码量,增强可读性。

    有种带参数的,在名字(x)后打空格,里面写参数(用逗号隔开,不用标类型) 


    例如#define max(a,b) ((a)>(b)?(a):(b)) 


    但是要记住它的本质,它只是单纯的替换。若不加括号,也许会出现各种运算顺序的错误。还有,不要将长的式子、函数、++或–放进去。不然会计算多遍,时间也许会炸。 


    取消宏定义:

    #undef x 


    不解释 
    还有其它的不怎么会用到,有兴趣的同学可以上网搜。 
    补上懒人的文件输入输出:

    #define I_O(x) freopen(""#x".in","r",stdin);freopen(""#x".out","w",stdout);

    cstring中常用的函数

    这些函数应该人人都会,但还是有好多人不会。

    先说一下指针与数组的关系。 


    若有数组int a[N]; 


    则a表示a[0]的地址(&a[0]) 


    *a即是a[0] 
    a+i=&a[i] 
    *(a+i)=a[i]

    memset(指针(数组名),数值(最大127,最小128,清零0),大小(sizeof ……)) 
    用法就是将一数组初始化。 


    memcpy(指针A,指针B,大小SIZE) 


    将B出复制SIZE这么多的内存到A处。

    排序

    sort(指针begin,指针end) 


    将begin到end-1的元素以operator<进行快速排序。 


    sort(begin,end,cmp) 


    将begin到end-1的元素以cmp进行快速排序。 

    有的孩子不知道cmp咋搞。 


    比如从大到小排序

    bool cmp(int a,int b)
    {
        return a>b;
    }

    a代表前面的元素,b代表后面的元素。表示排序后的序列满足a>b!

    稳定性排序: 


    stable_sort(begin,end); 


    steble_sort(begin,end,cmp);

    queue里有一个,但我不爱用,因为内部一定有许多繁杂的操作,比如指针开辟一个存储空间,会使程序变慢。 


    我用algorithm里的堆。 


    先注意一下比较函数int cmp(int a,int b) 


    a表示后代,b表示祖先,满足一个这样的顺序。(可以理解为大根堆) 


    make_heap(begin,end) 


    将begin到end-1的元素变成大根堆 


    make_heap(begin,end,cmp) 


    将begin到end-1的元素以cmp的顺序变成大根堆 


    push_heap(begin,end) 


    push_heap(begin,end,cmp) 


    前面begin到end-2已满足堆的性质,将end-1的元素放进堆 

    pop_heap(begin,end) 


    pop_heap(begin,end,cmp) 


    将begin的元素弹出,移至end-1处。

  • 相关阅读:
    前置++和后置++的区别
    snmp数据包分析
    [codeforces538E]Demiurges Play Again
    [codeforces538D]Weird Chess
    [BZOJ3772]精神污染
    [BZOJ4026]dC Loves Number Theory
    [BZOJ1878][SDOI2009]HH的项链
    [BZOJ3658]Jabberwocky
    [BZOJ3932][CQOI2015]任务查询系统
    [BZOJ3551][ONTAK2010]Peaks加强版
  • 原文地址:https://www.cnblogs.com/_Yrh/p/9240133.html
Copyright © 2011-2022 走看看