加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【FBI WARNING】一些Noip的黑科技 持续整理!

发布时间:2020-12-14 03:23:03 所属栏目:大数据 来源:网络整理
导读:有疑问或错误尽管 评论 !!? 下面以C++为准。 ?本文手(粘)打(贴)于各大博客之间 有问题。。。。。 我也不懂 max、min的优化 我们知道,打max、min时,要用分支(if语句)。这样会使程序超慢。 有没有其他方法?有的。? 当x0时 x31=-1 (222222222222222

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

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

max、min的优化

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

有没有其他方法?有的。?


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


当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,cmp);

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


我用algorithm里的堆。?


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


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


make_heap(begin,end)?


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


make_heap(begin,cmp)?


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


push_heap(begin,end)?


push_heap(begin,cmp)?


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

?

pop_heap(begin,end)?


pop_heap(begin,cmp)?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读