关于卡常

正文

快速的 I/O 方法

当遇到输入量巨大的题目时,正常情况下的 I/O 函数可能会导致 TLExceeded,而此时我们有两种方法可以加快此过程:

  1. 关闭同步输入输出流
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
//注意,在进行此操作后,应避免混用 cin 与 scanf,cout 与 printf,以防产生未知错误
  1. 更快的读入方式
int read(){
  int num = 0, fh = 1;
  char c = getchar();
  while(!isdigit(c))
    c == '-' ? fh = -fh : false, c = getchar();
  while(isdigit(c))
    num = num * 10 + c - '0', c = getchar();
  return num * fh;
}
//好像把 isdigit(c) 改成 c >= '0' && c <= '9' 会更快一点点?但是是真的一点点

向上取整

在需要向上取整的时候,除非在万不得已的情况下,否则请避免使用 ceil(),该函数在某些情况下可能会导致本就比较卡的程序 TLE,并且和 Ofast 一同食用时可能会导致运行出错(可能?)。可以用以下写法来实现向上取整的功能:

x = ceil(x / y); //Time Limit Exceeded
x = (x - 1) / y + 1; //Accepted

奇奇怪怪的火车头

不知道啥时候能用上的卡常火车头,但是当真的不知道怎么卡常的时候可以试试:code

STL 之关联式容器与无序关联式容器

当需要清空 map or unordered map 内的元素时,在某些情况下,使用 clear() 会比使用 erase(begin()) 来得慢,例:link

变量

在非必要的情况下,可以尝试将 long long 之类的长整型或浮点数改为 intshort 之类的,以减小常数。

运算

减少 % 之类的常数较大的运算的次数,可以尝试把多次操作合并为一次,不是很好的例子:412ms191ms

posted @   静观默察  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示