1. 程式人生 > >記錄一些奇奇怪怪的騷操作

記錄一些奇奇怪怪的騷操作

emm,想起來就更新

1,讀入掛

據說讀入掛可以在資料里加一堆空格卡掉,但是我覺得沒有哪個出題人閒的沒事卡這個吧

int read(){
    int c = getchar(),Nig = 1,x = 0;
    while(!isdigit(c))
        c = getchar();
    if(c == '-')
        Nig = -1,c = getchar();
    while(isdigit(c))
        x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
    return Nig*x;
}
#define read read()

2,上下取整

這個好理解

ceil(x/y)=\left\{\begin{matrix}k,(x = k*y,k=[0,1,2,3*****]) & & \\k+1,(x = [k*y+1,k*y+y-1],k=[0,1,2****]) & & \end{matrix}\right.

那麼加一個y-1就好了(適用條件是x大於等於0,y大於0)

int ceil(int x,int y){
    return (x+y-1)/y;
}

通用的上下取整,np函式是為了放置x*y超過long long

int np(ll x){
    return x>=0 ? (!x?0:1):-1;
}
ll floor(ll x,ll y){
    if(x%y == 0)
        return x/y;
    return (np(x)*np(y)>=0)?x/y:x/y-1;
}
ll ceil(ll x,ll y){
    if(x%y == 0)
        return x/y;
    return (np(x)*np(y)>=0)?x/y+1:x/y;
}

 

3,防止掉精度

1°強制轉化的時候

1.0*比(double),1ll*比(long long)容易寫多了

2°斜率

double也不一定保險,設k1=y1/x1,k2=y2/x2

k1=k2,就可以寫成x1*y2==x2*y1

4,對於某些狀態的壓縮儲存

例如

二維降維成一維,

int mmp[n][m];
int tmp[n*m];
mmp[i][j] = tmp[i*m+j];

字串hash,

char s[] = "";
unsigned int k = 0,p = 1331;
///k是字串hash成的那個數,p是一個素數,無符整數定義省去取模操作(大數取模費時間)
for(int i=0;s[i];i++)
    k = k*p + s[i];

有時候跑dfs的時候將狀態(一個不大的矩陣)變成一個數用於去重,

int mmp[n][m],k = 0,p = 2;///k是最後的答案,p是mmp[i][j]的二進位制最大位數
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            k = (k<<p) + mmp[i][j];///類比字串hash,或者說狀壓dp之類

全排列那裡有個康託展開