# ACM奇淫技巧

ACM奇淫技巧


差分操做

  • 描述:給定一個數組,每次能夠對數組某一個區間加一或者減一,求最少操做多少次可使數組所有元素一致,最終可能的序列有多少種。git

  • 題解:可使用差分,先求一個差分數組,差分數組中正數總和位x,負數總和爲y。因爲只能加一或者減一操做(加m減m操做能夠一樣分析,暫時沒有想出怎麼解,只是感受能夠一樣分析)。全部最少操做次數爲min(x,y)(解釋:每次操做選取一正數一負數,正數減1負數加1)+abs(x-y)(剩下全正或者全負的狀況,只能和差分數組的第一項或者 最後一項匹配)。最終可能的序列有abs(x-y)+1(解釋:取決於最後全正或者全負狀況下的操做一共abs(x-y)步操做,對原數組第一項的操做可能有(0,1,2,abs(x-y)一共abs(x-y)+1中操做方式)數組


座標旋轉

  • (x,y)繞原點逆時針旋轉\(\beta\)角到(s,t)
    此處輸入圖片的描述

ACM 卡常優化

vsc代碼塊(頭文件模板)

/*
 * @Author: yexm 
 * @Date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE
 * @Time: $CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND
 * @Location: ${TM_FILENAME} Line_$TM_LINE_NUMBER
 */
//加減代替取模優化,多數組結構體優化,puts()輸出優化
#include <bits/stdc++.h>
using namespace std;
#define fre freopen("data.in","r",stdin);
#define frew freopen("my.out","w",stdout);
#define ms(a) memset((a),0,sizeof(a))
#define re(i,a,b) for(register int i=(a);(i)<(b);++(i))
#define ree(i,a,b) for(register int i=(a);(i)<=(b);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define lson l,m,i<<1
#define rson m+1,r,i<<1|1
#define reg register
typedef long long LL;
const int inf=(0x7f7f7f7f);
inline void sf(int& x){
    x=0;int w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    x=(w?-x:x);
}
inline void pf(int x){
     if(x<0) putchar('-'),x=-x;
     if(x>9) pf(x/10);
     putchar(x%10+'0');
}
const int maxn=1e5+5;


int main(){
    
    
    return 0;
}

讀入輸出優化

//支持正負整數
inline void sf(int& x){
    x=0;int w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    x=(w?-x:x);
}
inline void pf(int x){
     if(x<0) putchar('-'),x=-x;
     if(x>9) pf(x/10);
     putchar(x%10+'0');
}

逗號表達式

  • 逗號表達式比分號快不少不少

內聯函數inline

  • 內聯函數的使用,通常函數比表達式慢不少。使用內聯函數在編譯的時候會直接在主程序中把函數內容展開,減小內存訪問。不適合代碼長和複雜的函數。
1 int max(int a, int b){.....}//原函數
2 inline int max(int a, int b){....}//直接加inline就行了。

寄存器變量register

  • CPU寄存器變量的使用

頻繁使用的變量,聲明時加上該register關鍵字,運行時放到CPU寄存器中,速度快。可是CPU寄存器空間小,變量多的時候,通常仍是丟到內存裏面的。數據結構

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

條件判斷加減代替取模

//設模數爲 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;}//代替取模-

自增運算符優化

  • 用++i代替i++,後置++須要保存臨時變量以返回以前的值,在 STL 中很是慢。

使用結構體優化

  • 若是要常常調用a[x],b[x],c[x]這樣的數組,把它們寫在同一個結構體裏面會變快一些,好比f[x].a, f[x].b, f[x].c 指針比下標快,數組在用方括號時作了一次加法才能取地址!因此在那些計算量超大的數據結構中,你每次都多作了一次加法!!!在 64 位系統下是 long long 相加,效率可想而知。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息