洛谷日报历年目录
  • 板块学术版
  • 楼主洛谷
  • 当前回复13917
  • 已保存回复13949
  • 发布时间2018/7/3 12:07
  • 上次更新2025/3/21 17:23:58
查看原帖
洛谷日报历年目录
3
洛谷楼主2018/7/3 12:07
2018/7/3 12:07
87627
AmlyC2018/10/11 08:49

@ComeIntoPower 非常感谢指导 OvO


还有我想问一下哪里可以找到lxl在NOIP2016时用struct手写queue的资料,我很想学一下 QAQ

2018/10/11 08:49
87627
AmlyC2018/10/11 10:33

@ComeIntoPower 作死的我又来投稿了 23333

NOIP 的 编程技巧  

2018/10/11 10:33
50882
OwenOwlNOOT2018/10/11 11:04

@BeyondOI 取模那个先除再乘感觉很假。

感觉 switch 和三目那一块没什么卵用而且很引战(雾

2018/10/11 11:04
87627
AmlyC2018/10/11 11:10

@OwenOwl 取模那个先除再乘 确实会快,我运行1e8 % 次快了一倍

2018/10/11 11:10
50882
OwenOwlNOOT2018/10/11 11:17

@BeyondOI 没测出任何差别

2018/10/11 11:17
87627
AmlyC2018/10/11 11:34

@OwenOwl 我懵了,这也是玄学。为啥和我昨天测试的不一样。玄学的例子


a%b


a-a/b*b

2018/10/11 11:34
50882
OwenOwlNOOT2018/10/11 11:36

@BeyondOI

long long z = x % y

long long z = x - x / y * y

出来的汇编是一样的,反正都会给你搞成 idiv,没任何区别

2018/10/11 11:36
87627
AmlyC2018/10/11 11:38

QWQ

2018/10/11 11:38
11751
ComeIntoPower小圆2018/10/11 11:39

@BeyondOI

块nm呢,div指令直接把余数都算出来了,你还乘了再减?要不是编译器救你,你怕是更慢

我哪知道lxl咋写的,反正他自称自己写了这个。就是普通的数组和函数外面套了一层struct

1.根据STL源码实现,pair也是普通的struct,所以两者速度应一样

2.其实更重要的问题是:你一直在抠没用的常数,这些东西多几句少几句指令没有用处,比如如下就是没用的常数:

(1)?:与if/else if,没有任何证据证明?:会比if/else if快

(2)switch根本不会做你想象中直接跳转的操作

(3)modadd,moddel还行,modmul是干嘛用的

(4)++x和x++根本不会有差别,O2下甚至连汇编指令都一样

牢记一句话,编译器比你聪明多了(推荐去https://gcc.godbolt.org/)

3.有用的常数:

(1)内存优化非常重要。有如下问题:使用内存连续,使用内存尽量小,申请和释放内存次数尽量少,想办法让CPU将你的东西搞到缓存里

(2)减少瓶颈操作次数,比如LCT/线段树的upd,pushdown是瓶颈,所以应该减少它们的次数。ZKW线段树正是因为减少了期望次数才变快了

(3)读入优化,这个就不用说。

(4)循环展开,刺激编译器给你并行操作。这个循环展开其实很有技巧,如果你直接展开有可能不会给你优化。

(5)dp的时候精确计算上界,减少状态数。在复杂度上除个常数是很有用的。有时候甚至可以直接降复杂度

如果你下次还只把我的话加上去,我就不予置评了

2018/10/11 11:39