ps:csdn莫名其妙吞我制表符和空格,若看着不爽,,忍着吧
愉(坑)快(爹)的十月总算撑过去了(感觉身体被掏空。。),,老衲终于从一个蒟蒻变成了另一个蒟蒻(没什么不对的。。),,回忆去年愉(悲)快(伤)的NOIP经历,,,(怎么办,感觉又要挂了),,我们来总结一发惨痛的经验教训,,。
(在说正文之前我想先来一个*蛤蛤蛤*的笑容)
好好学蛤,延年益寿。
——————————————————————————————
·根据大家多年NOIP经验,对于很多同学们来说题目难度与题目顺序貌似并没有太大关系。。。(这TM就是你T1爆0的原因嚒?)。如果T1太难了,这个时候,不要犹豫,果断的去(骂)做(出)T(题)2(人),,说不定后面的题会是一道超级大水(难)题呢,以我们高超的智商,,一定会AK(WA)的。
·虽然说考试时间比较长(和文化课的考试比起),但相信大家总会感觉自己被长者关怀了,,刚想完暴力,旁边的大佬都把T3给AK了,,,所以考场策略很重要,,说不定良心出题人会给送分点呢(良心凯爷万岁!)。。最后半个小时,就不要老想着搞个大新闻去AK T3,一定会被评测姬批判一番的。检查cena配置,检查文件名,以及代码中有没有什么低级错误(高级错误你就算发现也来不及了。。)。。然后,听(去)天(玩)由(扫)命(雷)吧。。
·不要老想着搞个高大上的STL容器,然后把题水过去,,,好歹给用Pascal的小朋友们留一点生存空间嘛。。。vector, map, set, list, queue, stack什么的搞搞暴力或者用来对拍就行了。但是你企图靠它们来AK,那就一定要好好优化一番,下面讲讲这些年来总结的C++的暴力优化技巧,以及一些注意事项,让你的程序跑得比香港记者还快:
——vector
不开O2真心慢,所以能少调用里面的东东就尽量少用;
比如我们可以将如下代码修改一下:
//vector <int> v;
for (int i = 0; i < v.size(); ++i) //...
访问.size()是很烧时间的,不妨改成:
//vector <int> v;
for (int i = v.size() - 1; i >= 0; --i)
另外,如果用vector充当一些不好确定大小的数组,建议放弃这种方法,改用数组,空间一定计算好,因为就算数据很多,vector 也会超时的。
——queue
一定注意当队列为空是不可以进行 .pop()操作的!先用 .empty()判断一发;如果你觉得你有强大的代码能力可以用try...catch 来 debug。
另外,STL库里的queue是不带指针的(这个我不确定蛤),更高级的queue如下:
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
对于priority_queue,如果排序一些很高大上(如结构体)的东东,一定要operator排序方式哦!否则编译报错会很难看的。。。
——map & set
同样基于RBtree的高级操作,虽然不开O2简直慢到爆炸,但map 和 set 让我们的查找操作方便了许多,同样若我们要把key设为一些奇妙的东东,operator必不可少,否则编译报错会更难看的。。。
——迭代器 & 指针
指针是 C 的一大特色,当然,指针用起来也很妙妙,一旦搞拐了,,蛤蛤蛤蛤,,,
为什么zgs不给我们安利一波指针的用法啊,还得我自己写。。
算啦,懒得写,自行百度吧。。。这里只将一下重点
::iterator 并不适用于所有STL容器,而且具体使用方式也不同,
首先,我们来一波代码:
vector <int> :: iterator it = v.begin() + 1
set <int> :: iterator it = s.begin() + 1
如果我们编译以下,会发现第二句会报错,对迭代器指针位置任意加加减减,对于set等树形结构是不可以的,而反向迭代器的首尾是.rbegin() 和 .rend(),虽然是反向迭代,但按顺序遍历还是得++;
注意 .end() 和 .rend() 指向的是数组外,遍历时靠 it != X.end() 终止,否则,,蛤蛤蛤蛤。。
——#include <algorithm>
算法库有很多很多的好东西,比如 sort, unique等等(Pascal学子内心几乎是崩溃的。。),而且有一些疑似math库里的东东,却莫名其妙出现在算法库。。嗯。。记得using namespace std;。。好好学习里面的玄学吧,说不定能骗很多很多分呢。。
——三目运算符
三目运算符提供了快捷的判断途径,但显而易见,三目里面是不可以加入关键字操作的,而这里我不得不分享一下我使用三目时发生过的灵异事件。。:
(/*条件*/) ? (/*语句A*/, /*语句B*/) : (/*语句C*/, /*语句D*/);
在三目中掺入多句操作,然后。。。当条件为true时,,,神奇的电脑执行了语句A和D??!!WTF!!
具体事故原因不详,,下次一定要小心谨慎。
灵异事件2:
X = (/*条件*/) ? A : B;
本来毫无违和感的一句,但如果条件中出现了and、or、xor,那么你就有机会再次碰上灵异事件了。。。
——#pragma warning(disable : )
disable理论上可以屏蔽一些警告,但是。。。DEV编辑器警告时并不会主动告诉你警告的编号,,那还disable个毛啊!!
而且,,我在虚拟姬上加上disable后发现然并卵。。托出去批判一番!!!