坑点
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; } }