解题方面
- 遇到一些 8 或者 10 这种级别的 n ,的时候,可以考虑状态压缩。
- 二分答案、dp、排序、队列都是联赛常考的内容。
- 枚举东西的时候,能少一点就少一点(在适当的地方 break,有时能缩短不少时间,线性筛就是个不错的例子)
- 有时一些看起来是数学题的题(研究数字性质的题),可能可以通过巧妙地建图跑最短路来解决。
还有一种,就是用几种长度凑出一个不小于某个数的长度,问最少的长度和是多少,也可以通过建图跑最短路来解决。
- 求多个点共同的 LCA 时,只需跑一次 LCA,就这几个点 dfs序 最小的和最大的 两个点的 LCA。
比赛方面
- 比赛时千万要记得写文件操作,血的教训……
- 写程序前先看题,看完再认真想,把细节想好,特殊情况等等,最好写在草稿纸上,最后写程序时就很顺畅了。
- 在我看来,打程序时最好分步来打,就是说把整个程序分成几部分,调好这一部分再继续开始打下一部分的程序 (比如对于一个线段树模板题,先写好建树并确保无误后再往后写修改,好了之后再写查询等) ,这样可以有效避免出现那种潇潇洒洒打完一百多行结果编译不过或者死循环,又怎么找都找不出错的情况。
- 时间充裕最好打对拍拍一下,想不出正解的话弄个暴力跑个极限数据放到程序里特判~
代码方面
- NOIP2017亲身经历告诉我们
- 数据一定要读完再对其做处理,千万不要读到一半 break,不然多组数据的时候会导致数据错位……
- 对于开方比较这种操作,要是平方不会爆 long long ,最好两边平方来比较,用
double
的话可能精度会出问题。(要是不太清楚数据大小的话用double
求稳也是可以的)
- 在答案需要取模时,减法操作时注意减完后先取模再加一次模数再去一次模,避免出现负数。
不熟的话最好别乱缩行,运算符优先级很坑的……
大致上顺序是这样算术运算
->位运算
->逻辑运算
附上运算符优先级表再次强调,千万注意运算优先级,不行的话打个括号都好 :-)
打队列的话,初始化只需
l=r+1
即可(判断队列是否为空就l<=r
)。个人习惯,要是你判断是(l<r
)的话,初始化就得是l=r
了。用数组模拟邻接表时,要是是无向图,注意边要开两倍以上空间。
要是要用到宏定义来简化代码中的重复式子,注意整个式子加个括号(是整个式子加括号,免得程序里面优先级出问题,比如线段树中写成
#define Mid l+r>>1
的话,程序里面实际的Mid+1
就变成l+r>>2了)
,应该写成#define Mid (l+r>>1)
。(位运算优先级比算数运算低,所以会出问题)想在程序中简写变量类型,最好用typedef,用宏定义#define可能会有些小问题,具体例子:
typedef long long LL;
用hash时最好用不常用的质数做模数(千万不要用1000000009这种),比如要是你发现你的QQ号或手机号是质数而且长度也还能接受,那么就可以选它们了。
hash时注意要在合适的地方”%“一下,不然出现负数就 gg 了,也可以考虑用 unsigned long long,它不仅长度够长,而且减到负数的时候会自动帮你模一个数,
好像是2^64吧,就不怕出现负数的错误了。用到浮点数时,精度要求高的话(时间足够),最好用上
long double
,定义直接用long double
,然后输出的时候强转一下double
就行了。注意各种变量在cstdio中输入输出的关键字
类型 | scanf关键字 | printf关键字 | 说明 |
---|---|---|---|
int | %d | %d | |
unsigned int | %u | %u | |
long long | %lld | %lld %I64d |
Linux系统 Windows系统 |
unsigned long long | %llu | %llu %I64u |
Linux系统 Windows系统 |
float double |
%f %lf |
都用%f | %.nf是保留n位小数输出 |
char | %c | %c | |
char[] | %s | %s | 字符数组前不用加”&”,比如:scanf("%s",a) 其中a为一个字符数组(c式字符串) |