記錄一些奇奇怪怪的騷操作
阿新 • • 發佈:2018-12-03
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,上下取整
這個好理解
那麼加一個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之類
全排列那裡有個康託展開