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">字體大小顏色

示例:
字體大小顏色

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章