坑点

cout

换行请用cout<<'\n',大量使用cout<<endl,评测机不好会导致超时(亲身经历 luogu P1440)

二分

二分过程最好用mid = (l+r)>>1

(l+r)/2 结果会舍去小数,也就是a+b是正数的时候,值变小,但是是负数的时候,值变大。
    比如1.5,和-1.5 。所以对于结果是正数,是向下取整,是负数的话,是向上取整
(l+r)>>1 正宗的向下取整

multiset

使用lower_bound 最好使用multiset自带的lower_bound,upper_bound也一样
使用普通的lower_bound可能会超时(亲身经历)

删除元素方面:如果是传入迭代器,只会删除迭代器指向的那一个值,如果传的是值,会删除所有等于这个值的节点

离散化

离散化能不用map就不要使用map,poj-2299 使用map离散化直接超时,改成用数组排序离散化AC

int快读

inline void read(int &x){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    x = s*w;
}

数学方面

质数

ll p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 51};

p数组里面的质数相乘刚好会超过1e18

求卡特兰数

int N;
ll f[maxn];
f[0] = 1;f[1] = 1;
for(int i = 2;i<=N;i++){
    for(int j = 0;j<=i-1;j++){
        f[i] += f[j] * f[i-1-j];
    }
}

离散化

ll arr[maxn];
int pos[maxn],tail;
struct node2
{
    ll v,id;
    bool operator< (const node2 & o) const{
        return v<o.v;
    }
}cpy[maxn];
void Lisa(){ //将原下表i和离散化的下标pos[i]对应起来
    sort(cpy+1,cpy+N+1);
    for(int i = 1;i<=N;i++){
        if(cpy[i].v != cpy[i-1].v) pos[cpy[i].id] = ++tail;
        else pos[cpy[i].id] = tail;
    }
}