NOIP卡常数技巧

xiaoxiao2021-02-28  13

摘自某位大佬的博客(http://www.cnblogs.com/widerg/p/7353866.html) 1.IO优化 fread 和 fwrite ,如果还想再优化有mmap…(然而并不会用,好像也没用。。。) 读入优化(这个非常重要!!!!!!!)

inline int Read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} return x*f; }

当然还有另一种但是这种只适用于读取非负数如下:

#inline int read(){ int num; char ch; while((ch=getchar())<'0' || ch>'9'); num=ch-'0'; while((ch=getchar())>='0' && ch<='9'){ num=num*10+ch-'0'; } return 0; }

输出优化:

inline void out(int x){ if(x>=10){ out(x/10); } putchar(x+'0'); }

大家注意一下快速读入和快速输出尽量爆int的数据就尽量不要用了我原来用快速输出就WA掉了但是用printf就没有问题 2inline 在声明函数之前写上inline修饰符(就像上面Read()一样),可以加快一下函数调用,但只能用于一些操作简单的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。 3register 在定义变量前写上register修饰符,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量:

register int n,m;

寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中; 快,不是一般的快,快到什么程度呢?:

register int a=0; for(register int i=1;i<=999999999;i++) a++; int a=0; for(int i=1;i<=999999999;i++) a++;

结果: 优化:0.2826 second 不优化:1.944 second 恐怖啊!!!! 4循环展开 循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)… 5取模优化(仅O2)

//设模数为 mod inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+ inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模-

6前置 ++

后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)

7不要开bool,所有bool改成char,int是最快的(原因不明)。 8if()else语句比()?()😦)语句要慢,逗号运算符比分号运算符要快。 9数据结构用指针代替数组(个人觉得无关紧要)

数组在用方括号时做了一次加法才能取地址! 所以在那些计算量超大的数据结构中,你每次都多做了一次加法!!!在 64 位系统下是   long long 相加,效率可想而知。

感谢这位不知名的神犇

转载请注明原文地址: https://www.6miu.com/read-850078.html

最新回复(0)