【学习笔记】OI玄学道—代码坑点
【学习笔记】OI玄学道—代码坑点
【目录】
- 【逻辑运算符的短路运算】
- 【\(cmath\) 里的贝塞尔函数】
- 【\(scanf\) 读入字符】
- 【\(cmath\) 中的 \(pow\) 函数】
- 【\(vector\) 的 \(size\) 函数】
一:【逻辑运算符的短路运算】
【运算规则】
&& 和 || 属于逻辑运算符。关于 && 和 || 的表达式的运算规则是这样的(用大写字母来表示表达式):
\(A\) || \(B\)
只要任意一个表达式为 \(true\),则整个表达式的运算结果为 \(true(1)\)。
\(A\) && \(B\)
仅当所有表达式都为 \(true(1)\) ,整个表达式的运算结果才为 \(true(1)\) 。
当任意一个表达式为 \(false(0)\) ,整个表达式的运算结果则为 \(false(0)\) 。
【短路运算】
&& 和 || 的短路运算,是指如果在进行前面的表达式的运算过程,通过判断已经明确的知道整个表达式的结果,那么就不会进行后面表达式的运算判断。例如:
\(A\) || \(B\) || \(C\) \(....\) || \(Z\)
如果 \(A\) 的运算结果为 \(true(1)\) ,则整个表达式的结果为 \(true(1)\) ,同时不会再对后面的 \(B\)、\(C\) 到表达式 \(Z\) 进行运算判断。
如果 \(A\) 的运算结果为 \(false(0)\) ,则根据 \(B\) 的运算结果继续判断。
\(A\) && \(B\) && \(C\) \(....\) && \(Z\)
如果 \(A\) 的运算结果为 \(true(1)\) ,则整个表达式的结,如果 \(A\) 的运算结果为 \(false(0)\) ,则整个表达式的结果为 \(false(0)\) ,同时不会再对后面的 \(B\) 、表达式3到表达式n进行运算判断。如果 \(A\) 的运算结果为 \(true(1)\) ,则根据 \(B\) 的运算结果继续判断。
【小技巧】
把能快速确定整个表达式结果 \(true(1)\) 或 \(false(0)\) 的表达式放在前面,这样由于短路运算后面的表达式可能不会被运算到,节省处理器的运算时间。
【坑点】
由于 && 和 || 的表达式存在短路运算现象,在短路之后不会对后面的表达式进行运算,所以含有 && 和 || 的表达式最好不要进行变量的赋值和运算操作,可以先计算好每个表达式的结果,直接拿结果进行 && 和 || 的运算。
在代码编写的时候就要注意这一点,以防由于 && 和 || 的短路运算导致写出来的代码运算结果与预期的不同。
(以上摘自 \(bulebin\) 大佬,原文链接)
【我心伤悲,莫知我哀】
曾经某个蒟蒻在尝试压行的时候,欣喜O(∩_∩)O~~地发现:
要是把赋值的操作放到判断里面,可以节省大量代码行.
然后(;′⌒`),
......
就没有然后了 (╯ ﹏ ╰)
没错,就是我,而且知道现在才知道当初为什么会错 /(ㄒoㄒ)/~~
好桑心(ㄒ﹏ㄒ)
.......
if(a>1){//b吃c
if(b==c){++ans;continue;};
//食物 天敌 同类
b1=find(b),b2=find(b+n),b3=find(b+2*n);
c1=find(c),c2=find(c+n),c3=find(c+2*n);
if(b2==c3||b3==c1||b3==c3){++ans;continue;};
f[b1]=f[c3],f[c2]=f[b3],f[b2]=f[c1];
}
else{//b,c是同类
//食物 天敌 同类
b1=find(b),b2=find(b+n),b3=find(b+2*n);
c1=find(c),c2=find(c+n),c3=find(c+2*n);
if(b1==c3||b2==c3||c1==b3||c2==b3){++ans;continue;};
f[b3]=f[c3],f[b1]=f[c1],f[b2]=f[c2];
}
if(a>1){
if((b==c)||(b2=find(b+n))==(c3=find(c+2*n))||(b3=find(b+2*n))==(c1=find(c))||b3==c3)++ans;
else f[find(b)]=f[c3],f[find(c+n)]=f[b3],f[b2]=f[c1];
}
else{
if((b1=find(b))==(c3=find(c+2*n))||(b2=find(b+n))==c3||(c1=find(c))==(b3=find(b+2*n))||(c2=find(c+n))==b3)++ans;
else f[b3]=f[c3],f[b1]=f[c1],f[b2]=f[c2];
}
二:【cmath里的贝塞尔函数】
你有使用过 \(cmath\) 函数库吗?
你有定义全局变量的习惯吗?
你有定义过 \(y0,j0\) 变量吗?
当你同时具备以上条件时,恭喜你,踩雷了。
在 \(camth\) 源代码的 \(262\) 至 \(267\) 行有这样一段代码:
_CRTIMP double __cdecl j0 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
_CRTIMP double __cdecl j1 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
_CRTIMP double __cdecl jn (int, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
_CRTIMP double __cdecl y0 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
_CRTIMP double __cdecl y1 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
_CRTIMP double __cdecl yn (int, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
实际上这个叫做 \(Bessel\) 函数。
所以写代码时应注意不要定义 \(j0,j1,jn,y0,y1,yn\) 这些变量,但仅限于全局变量,如果是局变量的话,尽情的使用吧。
【参考文献】
三:【scanf读入字符】
由于 \(scanf\) 的高效,我们通常喜欢用 \(scanf\) 来读入,然而这东西也会坑人,例如这种情况:
在每行的读入中,由一个字符作为开头。
\(cin\) 在读入时会跳过空格和换行,\(scanf\) 只会跳过空格,而不会跳过换行,所以如果直接在每行读入整数之前写 \(scanf(“\%c”,\&ch)\) 的话\(.......\)
改成 \(scanf(“\_\%c”,\&ch)\) 就可以了(下划线处是一个空格)
四:【cmath中的pow函数】
\(camth\) 函数库里的 \(pow\) 函数精度弱的惊人,可能本地自己测数据全对,交上去全 \(WA\),所以快速幂很重要,不能为了偷懒直接用 \(pow\),风险较大一般承受不起。
五:【vector的size函数】
\(size()\) 函数可返回 \(vector\) 大小,其返回值类型为 \(size\_type\),应强制转换成 \(int\) 后再使用,例:
int n=Q.size()-1;
for(int i=0;i<=n;++i);
for(int i=0;i<=(int)(Q.size()-1);++i);
\(To\) \(be\) \(continued...\)
【学习笔记】OI玄学道—代码坑点的更多相关文章
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- 学习笔记:python3,代码。小例子习作(2017)
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
- 学习笔记:python3,代码。小例子习作
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
- Java Core 学习笔记——3.char/Unicode/代码点/代码单元
通用字符集(UCS) UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集. UCS包括了其他所有的字符集(包含了已知语言的所以字符). ISO/IEC 1 ...
- 微信小程序学习笔记1--小程序的代码构成
最近打算学习一下微信小程序,看了微信公众平台的文档感觉还比较简单,就从这个方向重新找回学习的状态吧: 1.先了解一下小程序的代码构成: 创建项目后会看到四种后缀的文件: .json 后缀的 JSON ...
- ISD9160学习笔记04_ISD9160音频编码代码分析
前言 录音例程涉及了录音和播放两大块内容,上篇笔记说了播放,这篇就来说说录音这块,也就是音频编码这部分功能. 上篇笔记中的这段话太装逼了,我决定再复制下,嘿嘿. “我的锤子便签中有上个月记下的一句话, ...
- ISD9160学习笔记03_ISD9160音频解码代码分析
录音例程涉及了录音和播放两大块内容,这篇笔记就先来说说播放,暂且先击破解码这部分功能. 我的锤子便签中有上个月记下的一句话,“斯蒂芬·平克说,写作之难,在于把网状思考,用树状结构,体现在线性展开的语句 ...
- 《手把手教你学C语言》学习笔记(4)---代码规范
编程过程中需要遵守编译器的各种约定,例如以下代码: 1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 print ...
- [javase学习笔记]-8.7 静态代码块
这一节我们看一个比較特殊的概念,那就是静态代码块. 前面我们也提到过代码块,就是一段独立的代码空间.那么什么是静态代码块呢?说白了,就是用statickeyword修饰的代码块. 我们来看一个样例: ...
随机推荐
- wannafly-day1 Problem A - Birthday
思路:队友贪心WA了,然后就没有然后了,自己也是第一次接触最小费用流的题.借这个题来学习一下,利用Spfa每次来找到一个最短的路径同时保存路径,每一次寻找最短路径就将这条路的最小费用流给剪掉,然后继续 ...
- CTF常用在线工具总结
在线工具 MD5加密 MD5解密(推荐) MD5解密(推荐) MD5解密 escap加解密 维吉尼亚密码 SHA 对称加密AES DES\3DES RC4\Rabbit Quoted-print ...
- Uva1103 Ancient Messages
题意:识别图中的象形文字.但是,图形可以任意的拉伸,但不能拉断. 分析:这种题如果图形没有特征是不可做类型的题,不过观察图形可以发现每个图形中的洞的数量是一定的,我们只需要数出每一个封闭图形的洞数就能 ...
- [河南省队2012] 找第k小的数
★★☆ 输入文件:kth.in 输出文件:kth.out 简单对比时间限制:1 s 内存限制:128 MB 题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2 ...
- vim中256色的配色表
vim貌似支持的颜色很有限.white black yellow cyan magenta blue grey green red,大多数颜色前面都可以加light 或者 d ...
- DJANGO中正规的建立与USER外键的方式
以前都是直接与user 最近看书,上说settings.AUTH_USER_MODEL,这样好些...是为记. from django.db import models from django.con ...
- [转][MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- Java 注解入门实例 && 注解传參
參考 概念:java提供了一种原程序中的元素关联不论什么信息和不论什么元数据的途径和方法 JDK内置系统注解: @Override 用于修饰此方法覆盖了父类的方法; @Deprecated 用于修饰已 ...
- MYSQL利用Navicat对含有Bold字段表进行导入导出
MYSQL中含有Blob字段是一件挺麻烦的事情,导出导入不方便.我介绍我是怎么做的. 1.在MYSQL的my.ini最后中加入一行配置max_allowed_packet = 100M,重新启动MYS ...
- C++学习之可变参数的函数与模板
所谓可变参数指的是函数的参数个数可变,参数类型不定的函数.为了编写能处理不同数量实参的函数,C++11提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标 ...