其实主要是一些做题时遇到的小问题小方法等等,希望在这里能给大家一点帮助√
召唤链接版目录:
下面开始我们的正题吧√
一些编译中出现的小错误分析
http://blog.csdn.net/qq_36693514/article/details/77905589
另外一些稍微点出来一下:
TLE
有时候是因为时间复杂度过高,但也可能因为你对一个数组赋值,而且这个数组开的太大,倒是memset赋值贼慢超时。。。
特别惨的TLE是你的文件输入输出写错了(写成了别的名字)
MLE
望天哭,开小了数组是爆栈崩溃访问无效内存,开大了是全崩,这两项都能凭借滚动数组优化(但是滚动数组优化时间得看情况,很有可能会更慢2333)
RE
数组开小或者栈溢出访问无效内存奇怪的错误
CE
mmp给赋初值太大都有可能本地评测通过但是最终评测机上CE掉,更加脑残的是不小心定义关键字的时候那死的叫个无声无息
PE:
感觉比CE还惨烈
CTLE:
。。至今,,自己还未亲身还没遇到,编译超时。。额,,
#include
万能头文件在很多OJ上都能直接用,(poj好像除外,Cena有的评测路径中直接判处CE立即执行)
但还是推荐大家写出头文件emmm,有助于大家理清思路
cstdio freopen和scanf
window.h system(“pause”);
(不过好像没有window有cstdlib这个是可以的?大概是头文件是cstdlib带有这几个:
exit, getenv, system
在cstdlib里存在这个
函数名称: exit
函数原型: void exit(int state)
函数功能: 程序中止执行,返回调用过程
关于取整函数:
#include
< cmath >库包括
① double类型
ceil-上取整 floor-下取整
② log2()和log10()有效
log()同样有效,底数为e(自然对数)
↑实验得出
double a=0.9;
cout<<(int)a<"0"
long double
这竟然不能直接定义输入,实现的话需要定义int变量再强转成long double才可以,不然会莫名挂掉【清北十一测试亲身体验】
int n,k;
ans=(long double)n/k;
精度
关于精度问题则是要注意类型的转换,像是求一个double却在到处里都是int,容易出现错误,尤其注意pow里面emmmmm 好多人CE都是显示pow(X,X)is xxxxxxx
妈耶
unsigned:无符号长整型!
ε=(´ο`*)))
一旦取到负值这个unsigned long long就要炸掉,,,在求等比数列通项公式的时候千万注意有减法的地方不要上unsigned,真的炸掉
将暴力与你的正解进行对拍增加正确性和rp
http://blog.csdn.net/qq_36693514/article/details/78237082
坑,待填
G++ MinGW32的某种允许的调试 C:\MinGW\bin\g++.exe %s.cpp -o %s.exe
由于会牵涉到动态申请空间或者递归啊队列啊调用过多这样的问题,所以我们先单纯的看看怎么计算数组占了多大空间
将数组总大小算出来再除以1024(将b转为Kb),然后再除以1024(将Kb转成Mb),这就是我们所最终用到的空间大小了
N维数组的计算方式是每一维的大小乘起来emmmmm所以说不要乱开数组大小,真的会惨遭MLE的
法一:
while(1)
{
scanf("%d%d%d",&x,&y,&val);
if(x==0&&y==0&&val==0)
break;
}
法二:
{
while(~scanf("%d",&n)&&n)
}
sort(a+l,a+r)
法三:
while(scanf("%d",&n)!=0)
{
if(n==0) break;
...
}
默认の大根堆/优先队列 重载为小根堆
前注:
priority_queue
–>是默认大根堆
重载<运算符
bool operator <(const yuan &a,const yuan &b)
{
return a.r
重载max/min
法一:
inline int max(int a,int b)
{
return a > b ? a : b;
}
法二:
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
重载高精运算符
详见高精度系列【躺】
http://blog.csdn.net/qq_36693514/article/details/78301128
首先说一下inline
这是个好东西√,加到函数前头,据说可以用这个来快快跑
但是inline也有弊端,如果函数递归很多次,比如dfs就不适合,用了之后会占用程序编码空间emmmm
====================================================
再说一下register
实现方法:
#define RI register int
这个东西的具体用法是:
for(RI i = 1;i <= n;i ++)
read(num[i]),maxn = max(maxn,num[i]);
应用到for循环之中emmmmmm……..
对于优化有奇效
注意:
如果直接在主函数外定义变量,那么:
13 4 [Error] register name not specified for ‘xxx’
就会有这样的错误(但是在自己定义的函数中用的话就没有问题)
不过应用到主函数中定义就完全可以应用,这样的话不会报错
线段树左右儿子p*2,p*2+1的美观定义法
#define ls i<<1 //左
#define rs i<<1|1 //右
#define m(i) ((q[i].l + q[i].r)>>1)//中间节点
此外向size/SIZE maxn/MAXN 等等只是名字不同而已,个人喜好嘛
const int sz = 1010;
int num[sz];
typedef派
typedef long long LL;
define派
#define LL long long
注意后面有无分号以及之间顺序
快读是qdez的大佬们的读法,我一般读手读emmmmm
inline void read(int &x)
{
x = 0;bool flag = 0;char ch = getchar();
while(ch < '0' || ch > '9')
{if(ch == '-') flag = 1;ch = getchar();}
while(ch >= '0' && ch <= '9')
{x = x * 10 + ch - '0';ch = getchar();}
if(flag) x *= -1;
}
inline void write(int x)
{
if(x < 0)
putchar('-'),x *= -1;
if(x / 10)
write(x / 10);
putchar(x % 10 + '0');
}
还有isdigist来判断的,不过不想写了emmmm,感觉这个更简洁明了好理解
sort函数的三个参数
第一个-开始值的地址 第二个-结束值的地址 第三个-排序的函数,若没有则默认为升序排列
记住函数return中大于为降序,小于为升序.
现在说对结构体数组的排序;
#include
#include
using namespacestd;
struct node
{
int a;
int b;
double c;
}arr[100];
bool cmp(node x, node y)//要定义成bool形
{
if(x.a !=y.a) return x.a < y.b;
if(x.b != y.b) return x.b > y.b;
return x.c > y.c;
}//先根据a升序排列若相等则根据b来降序排列 否则 按照c降序排列;
sort(arr, arr+90,cmp);//直接加+90而不是作为下标,
定义bool函数,形参为结构体变量,用结构体变量元素排序:
bool cmp(es l, es m)
{
if(l.a == m.a) return l.b > m.b;//结构体按照b元素的降序排列;
return l.a < m.a;//结构体按照a元素的升序排列。
}
对于DP来说真是一切皆有可能,状态表示不出来二进制状压,维数不够了填维,在面对了九维DP之后人生仿佛已经无所畏惧(三维树形?四维棋盘型?五维递推转移?不够看),九维效果
dis[ ][ ][ ][ ][ ][ ][ ][ ][ ] ← 再脑补for循环,自行体会
真是个好东西23333
http://blog.csdn.net/qq_36693514/article/details/78279869
半坑,正在打
http://blog.csdn.net/qq_36693514/article/details/78079522
1、在128MB内存下,对于int类型(一个int四个字节),数组最多开3200w,对于bool类型(一个字节),可以开四倍;
2、1s时间限制下,计算机可以计算的次数我们认为是1e8次;
3、考试的时候不会正解就努力写暴力吧,
写暴力的时候拿全带特判的分,比如给你棵树,有一条链的数据点
一些n == 1,n == 2可以手算打表的点,这些特判可能比较麻烦,但是好拿分,比如斗地主的30分打表;
4、注意运算符的优先级,这个很容易出错,用define写一些东西的时候,别管什么都加括号(写一些带运算的东西的时候),用位运算的时候拿不准就都加括号,特别注意位运算和逻辑运算符(==,<=),的优先级问题
5、数组别开小了,尤其是倍增的时候,好几次数组开到20然后访问下标20了,一定要开够,不能RE(RE和MLE都要罚跑圈的w)
6、文件操作别写错,尤其是r和w,这个翻车无输出简直是人间惨剧惨绝人寰
7、书接上回,文件操作不写错也不代表一定躲得过这一劫,很有可能把freopen一个激动开到int或者void函数中然后无限死循,也很有可能考试考完,打完cpp A,B,C之后,结果给文件名叫B和C的cpp文件中一个激动粘贴上了freopen(“A.in”,”“r”,stdin); 这样会造成无限TLE,从第一个点开始T完所有点,而且时间几乎一样,人间惨案
8、一定要注意题目是不是给定“过滤行尾回车空行”,有时顺手写个puts(“”);或者‘\n’会直接开心的PE掉(虽然显示的仍是WA ε=(´ο`*))))
字体大小颜色
size="5" color="red" face="" >233
size="5" color="black" face="楷体" >233
size="5" color="red" face="宋体" >233
size="5" color="red" face="黑体" >233
size="5" color="red" face="隶书" >233
示例:
233
233
233
233
233
>size="5" color="black" face="楷体" >
>size="8px" color="#01B468">字体大小颜色
示例:
字体大小颜色