2018.1.25
1. C++的转化类型:
例如我们想把两个多项式a,b,进行(a)/(b)操作
因为方便,我们想直接把两个多项式转为double或long double,此时必须写成:
(long double)(A)/(B)
千万不能写成
(long double)(A/B)
- 在做1968. 【2011集训队出题】设计铁路这道题时,因为用了斜率优化,而我没有写成第一种形式,所以精度总是会有误差.
2018.4.6
2.宏定义MAX,MIN:
因为常数,大多数人有宏定义\(max,min\)的习惯.
但这时应当注意,如果我们需要比较的是一个函数值,或者一个需要大量计算得到的结果,这时,有两种方法:
一,用一个变量存起来.
二,不要宏定义
往往第一种方法会使代码量增加,且不美观,所以此时,第二种方法比较受欢迎.
一定要注意不要重复计算...常数巨大!
2018.4.16
3.数组参数:
- 比方说我想带一个数组到过程里,我们知道,有一种特殊的C++式的方法:
int a[100];
void mine(int *a) {
...
}
int main() {
mine(a);
}
我们用一个\(*\),类似指针的意思,但是实现里面还是与数组一模一样.
值得一提的是,对于C++而言,\(*\)式数组仅仅支持\(1\)维,对于二维及跟高维度的数组,我们必须采用结构体!
像这样:
sturct node {
int array[100][100];
} t;
void add(node x, node y) {
x.array[1][1] = y.array[1][1];
memset(x.array, 0, sizeof a.array);
...
}
int main() {
add(t);
}
当然,如果我们在过程里面,不需要所谓的二维..
那我们还可以这样做:
int a[100][100];
void reduce(int *a) {
a[1] = 1;
a[2] = 2;
}
int main () {
reduce(a[1]);
reduce(a[2]);
printf("%d %d",a[1][1],a[2][2]);
}
- 输出结果是\(1\ 2\)
2018.4.21
4. 对拍
有些题,真的不管你怎么对拍,会发现都拍不出错,所以,对拍并不是万能的.
这时,一定要仔细思考自己的程序是否会有漏洞,脑+眼+手解决..
2018.6.7
5. longlong取模
【COCI2007】追捕盗贼做这题的时候我用了双Hash,我是这样打的:
#define T1(x, y) (long long) (x * Mo1 + y * Mo2) % Mo3
#define T2(x, y) (long long) (x * Mo4 + y * Mo5) % Mo6
const int Mo1 = 135123, Mo2 = 122321, Mo3 = 1235335,
Mo4 = 121231, Mo5 = 723233, Mo6 = 3323123;
然后死活WA.
最后发现是爆longlong,改成这样就好了:
#define T1(x, y) (x * Mo1 + y * Mo2) % Mo3
#define T2(x, y) (x * Mo4 + y * Mo5) % Mo6
const long long Mo1 = 135123, Mo2 = 122321, Mo3 = 1235335,
Mo4 = 121231, Mo5 = 723233, Mo6 = 3323123;
- 我只想说,还不太熟的东西最好别用,其实就几个常数,开longlong也没关系,不要冒险.