记录一些奇奇怪怪的骚操作

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之类

全排列那里有个康托展开

猜你喜欢

转载自blog.csdn.net/Du_Mingm/article/details/84452160