简单行程
还有必要讲吗?还是要讲讲的。今天搞了件大事(xin)情(wen),不过讲出来不太好,就不讲了,大致就是黑客干的那些事。
学到了什么
说实话,今天学到了不少,感觉自己的世界观都被改变了,在此和大家分享。
- DP的单调性优化有两种方法:斜率优化和四边形不等式。
- vector、stack、queue比较慢,考试时最好自己写。
- 双端队列,最好也自己写,经典应用:滑动窗口。
- 测程序内存占用的两种方法(详情见附件)
- 不要用float,用double,用float不如用int。
- 可以使用C++自带的priority_queue,不需要自己写。
- 自带的priority_queue默认是最大优先队列,要想实现最小优先队列,不必使用greater,可以将存入的数据改为其相反数,取出时在改过来即可。十分巧妙。
- 传址比传值快。
- 在C++自带的priority_queue中放结构体时,结构体要重载小于号。
- 一个常见错误。(详情见附件)
- scanf的巧妙用法(详情见附件)。
- 预编译的巧妙用法(详情见附件)。
不多讲,直接看附件。
附件
测程序内存占用
第一种,用MinGW自带的size.exe工具,如图:
具体使用方法:将你的程序放在该目录下,在该目录下打开cmd,输入如下命令:
size.exe [您的程序名字]
效果如图:
红框中是内存大小,前者是十进制,后者是十六进制,单位是字节。
不过值得注意的是,这算的只是程序的静态内存,什么是静态内存?就是在函数外部定义的变量和数组,举个例子:
int out[1000];//这是静态内存
int main(){
int in[1000];//这是动态内存
return 0;
}
一个常见错误
这是什么神奇的错误呢?先上代码:
char c[1000];
for(int i=0;i<strlen(c);i++){
}
有什么问题?strlen()也是需要计算时间的,这样放在循环里,会重复计算多次,导致时间复杂度增加,正确写法:
char c[1000];
int x=strlen(c);
for(int i=0;i<x;i++){
}
scanf的巧妙用法
举个例子,如果我们要读入两个日期,然后计算他们之间有多长时间,该怎么读?比如:
1989-06-24 00:00:00
字符串处理?那你就out了!正确读法:
scanf("%d-%d-%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
惊不惊喜?意不意外?就是这么神奇。
预编译的巧用
用法一
scanf虽然神奇,但在读取long long型数据时,比较麻烦,为什么?因为在不同平台下,用的格式控制不一样:
WIN32 %I64d
Linux %lld
WIN64 %I64d %lld
那么我们该怎么办呢?
我们可以这样处理:
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
int main(){
long long x;
scanf(LL,&x);
return 0;
}
相当的巧妙。
用法二
网上测评往往用的是标准输入输出,但我们自己测试通常用文件,切换很麻烦,所以我们也可以用预编译来处理:
int main()
{
#ifdef ONLINE_JUDGE
;
#else
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
return 0;
}