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之类
全排列那里有个康托展开