カード・チャン(転載)

:より転載https://blog.csdn.net/IOT_SONG/article/details/51477071

             https://blog.csdn.net/qq_33957603/article/details/79946680

    https://blog.csdn.net/leader_one/article/details/78430083

    https://blog.csdn.net/xuxiayang/article/details/81021585 

伝説の神クラスの高速読み取りのfread:

  #define GETCHAR()(S == T &&(T =(S = BB)+関数fread(BB、1,1- << 15、STDIN)、S == T)EOF:* S ++)
  CHAR BB [1 << 15]、* S = BB * T = BB ;;
  IL LL)は(読み取り
  {
      チャーC再; F = 0。
      一方、(C = GETCHAR()、<= 47 || C> = 58 C); F =(F << 3)+(F << 1)+ C-48。
      一方、(C = GETCHAR()、> = 48 && C <= 57 C)、F =(F << 3)+(F << 1)+ C-48。
      Fを返します。
  }

ファスト注意を失います:

基本的なプログラム
のボイド書き込み(int型X)
{
    / *この行では、特別な取り扱いを決定することができ、このような処理や他の負* /として
    IF(X / 10)を書く(X> 9。); //分解は、分解することができる
    (のputcharをX%+ 48 10); // C ++のputcharアクセル出力速度係数を使用
}
上にあることが必要と変換最適化出力を、
1出力空間
ボイドwritespace(INT X)
{
    書き込み(X)のputchar(32 );を返す; //ここでは依然として速い速度PUCHARを利用する
}
2.リア出力は改行
ボイドのwriteln(INT X)
{
    のputchar(10); //のputcharは依然として非常に高速に、高速の利点を使用書き込み(X)を効果
}

0.位运算心法:(掌握粗体字)
&(与逻辑):有0出0,全1出1;
|(或逻辑):有1出1,全0出1;
~(非逻辑):空即是色,色即是空;
^(异或):相异出1,相同出0;
1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300%
  x = x * 2;
  x = x * 64;
  //改为:
  x = x << 1; // 2 == 21
  x = x << 6; // 64 == 26
2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350%
  x = x / 2;
  x = x / 64;
  //改为:
  x = x >> 1; // 2 == 21
  x = x >> 6; // 64 == 26
3. 数值转整数加速 10%
  x = int(1.232)
  //改为:
  x = 1.232 >> 0;
4. 交换两个数值(swap),使用 XOR 可以加速20%
  var t:int = a;
  a = b;
  b = t;
  //equals:
  a = a^b;
  b = a^b;
  a = a^b;
5. 正负号转换,可以加入 300%
  i = -i;
  //改为
  i = ~i + 1; // NOT 写法
  //或
  i = (i ^ -1) + 1; // XOR 写法
6. 取余数,如果除数为 2 的倍数,可利用 AND 运算加速 600%
  x=131 % 4;
  //equals:
  x=131 & (4 - 1);
7. 利用 AND 运算检查整数是否为 2 的倍数,可以加速 600%
  isEven = (i % 2) == 0;
  //equals:
  isEven = (i & 1) == 0;
8. 加速 Math.abs 600% 的写法1,写法2 又比写法1加速 20%
  //写法1
  i = x < 0 ? -x : x;
  //写法2
  i = (x ^ (x >> 31)) - (x >> 31);
  //写法3
  i=x^(~(x>>31)+1)+(x>>31);
9. 比较两数值相乘之后是否拥有相同的符号,加速 35%
  eqSign = a * b > 0;
  //equals:
  eqSign = a ^ b > 0;

10.if,else语句比三目运算符语句要慢,逗号运算符比分号运算符要快。

11.结构优化

      如果你要经常调用a[x],b[x],c[x]这样的数组,把她们写在同一个结构体里面会变快一些,比如f[x].a, f[x].b, f[x].c
      指针比下标快。

12.能少判断少判断 (if)

   Floyd初始化

for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)   gra[i][j]=inf
for(int i=1;i<=b;i++)   gra[i][i]=0
是比

for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(i==j) gra[i][j]=0;
        else gra[i][j]=inf
    }     快80%以上的,,因为要每次去比较。

13.由于没有开O2优化,会导致一些本来没有区别的变得比较明显。
多维数组把大的数放前面:
例如 int f[10000][1000][100] 而不是 f[100][1000][10000],跑起来差距0.Xs。
有时比算法的差距还大

14.循环内的问题
  E.g1
  for(int i = 0; i <= n; i++)
  {
    work1();
    work2();
  }
  E.g2
  for(int i = 0; i <= n; i++) work1();
  for(int i = 0; i <= n; i++) work2();
  运行效率哪一个快呢?
  应该大多数人都觉得是第一种快,因为它少了一遍变量枚举-
  其实这是片面的,如果work1( )和work2( )运算量都比较大的话,是第二种更快 

15.对于运算量比较小的计算式,几个运算写在一条式子会更快(可能不是快一点)

  x= a+b; x = x%mod; 是没有 x = (a+b)%mod 速度快的在循环量大时有奇效

16.据说主函数用signed比int更快

17.摘自remarkable

二.运算

 

mod定义成const

 

能乘不除,能加减别用魔法模法

 

能位运算就别用加减乘除···

 

x2^n改成<<n

 

/2^n改成>>n

 

swap(x,y)改成x^=y^=x^=y

 

模数若为2^n可以直接&(mod-1)

 

也可以先开unsigned int最后取模

 

两个小于模数相加用down(x)

 

(x%mod+mod)%mod改成up(x%mod)

 

おすすめ

転載: www.cnblogs.com/three-D/p/11280644.html