qwq不断更新的总结【NOIP前夕】

其实主要是一些做题时遇到的小问题小方法等等,希望在这里能给大家一点帮助√
召唤链接版目录:


下面开始我们的正题吧√

一、知识类:

错误提示

一些编译中出现的小错误分析
http://blog.csdn.net/qq_36693514/article/details/77905589
另外一些稍微点出来一下:
TLE
有时候是因为时间复杂度过高,但也可能因为你对一个数组赋值,而且这个数组开的太大,倒是memset赋值贼慢超时。。。
特别惨的TLE是你的文件输入输出写错了(写成了别的名字)
MLE
望天哭,开小了数组是爆栈崩溃访问无效内存,开大了是全崩,这两项都能凭借滚动数组优化(但是滚动数组优化时间得看情况,很有可能会更慢2333)
RE
数组开小或者栈溢出访问无效内存奇怪的错误
CE
mmp给赋初值太大都有可能本地评测通过但是最终评测机上CE掉,更加脑残的是不小心定义关键字的时候那死的叫个无声无息
PE:
感觉比CE还惨烈
CTLE:
。。至今,,自己还未亲身还没遇到,编译超时。。额,,

头文件

#include<bits/stdc++.h>

万能头文件在很多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>


< cmath >库包括
① double类型
ceil-上取整 floor-下取整
② log2()和log10()有效
log()同样有效,底数为e(自然对数)
↑实验得出

强转 , long double , 精度 , unsigned

double a=0.9;
cout<<(int)a<<endl;
-->"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

Cena调试

坑,待填
G++ MinGW32的某种允许的调试 C:\MinGW\bin\g++.exe %s.cpp -o %s.exe

程序占用空间大小计算

由于会牵涉到动态申请空间或者递归啊队列啊调用过多这样的问题,所以我们先单纯的看看怎么计算数组占了多大空间
将数组总大小算出来再除以1024(将b转为Kb),然后再除以1024(将Kb转成Mb),这就是我们所最终用到的空间大小了
N维数组的计算方式是每一维的大小乘起来emmmmm所以说不要乱开数组大小,真的会惨遭MLE的

二、技巧类

多组输入以0结尾表输入结束

法一:

    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<b.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 和 register

首先说一下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)//中间节点

数组大小定义const

此外向size/SIZE maxn/MAXN 等等只是名字不同而已,个人喜好嘛

const int sz = 1010;
int num[sz];

变量类型定义

typedef派

typedef long long LL;

define派

#define LL long long

注意后面有无分号以及之间顺序

手读手输 or 快读快输

快读是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<iostream>
#include<algorithm>
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来说真是一切皆有可能,状态表示不出来二进制状压,维数不够了填维,在面对了九维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 ε=(´ο`*))))

五、不知怎么分类

Markdown

字体大小颜色

<font size="5" color="red" face="" >233
<font size="5" color="black" face="楷体" >233
<font size="5" color="red" face="宋体" >233
<font size="5" color="red" face="黑体" >233
<font size="5" color="red" face="隶书" >233

示例:
233
233
233
233
233

><font size="5" color="black" face="楷体" >
><font  size="8px" color="#01B468">字体大小颜色

示例:
字体大小颜色

发布了75 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36693514/article/details/77822162