
不要問我為什么名字叫這個qaq
一.一就是用來亂扯的...?
打個小小的
廣告
啦啦啦~
不僅有精心提煉的圖論。
還有你不得不學的數論 。
#include <bits/stdc++.h>
//萬能頭文件
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
#define frei(s) freopen(s,"r",stdin)
#define freo(s) freopen(s,"w",stdout)
#define ll long long
#define u unsigned
#define ssr(q) scanf("%d",&q);
#define sr(q) printf("%d",q);
#define Q int
//...可以隨便搞
using namespace std; #define rt return
#define inf 0x3f3f3f3f
#define infll 4557430888798830399ll
#define pc(x) putchar(x)
#define spc putchar(' ')
#define gc getchar()
#define ln pc('\n')
#define writeint(x) printf("%d",x)
#define lowbit(x) (x&(-x))
//如果用的多的話可以 省時省力!
int main() { Q w; ssr(w); sr(w); //以下不一一列舉 //...
rt 0; }
+
for(int t=m; t; t--) a[++n] = b[t]; // 循環中間的 t:非零即真,遇到 t=0 才停下
int ans(0); // 效果等價於 ans=0
+
編表的num從0開始++,跟從1開始++的區別 如果從0開始編號,在往上反的過程中會用到0(因為0的編號是0(為假)嘛),所以要將head數組手動設置為-1才能進入0號元素那條邊,如果不設置為-1,只能用1往后的邊 所以 (Ps:now初始值為0) void add(int pre,int to) { h[now].to=to; h[now].next=heads[pre]; heads[pre]=now++; /* 前提是heads數組已經設置為-1,並且在使用的時候 for(int j=heads[i];j!=-1;j=h[j].next) 或者 //for(int j=heads[i];~j;j=h[j].next)
~表示取反. */ } 而如果這樣的話 void add(int pre,int to) { h[++now].to=to; h[now].next=heads[pre]; heads[pre]=now; /* 從一開始編號的話,到0就停止,所以不需要手動設置為-1 */ } (額...學姐說的%%%)
+
///優讀
inline int reads() { int x=0,f=1; char ch=getchar(); while(ch>'9' || ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; }
二.0號元素很想你qwq
開數組的時候我們都喜歡從1號開始使用,而把0號元素冷落了
但是開了就是開了,0號閑着也是閑着,不如把它合理的利用起來!
所以,可以用a[0]來計數,
a[0]++,a[0]--什么的,
回收利用我最強!2333
三.字符串讀入方式
讀字符(串)的各種方式,老是出錯的你中槍了嗎???
列出幾種空白符:換頁符、縱向制表符、橫向制表符('\t')、空格(' ')、換行符('\n')、回車符('\r')
char ch; char str[11];
1.getline讀入:
讀入整行數據,它使用回車鍵輸入的換行符來確定輸入結尾.
調用方法:
首先說明getline()的原型:getline (istream &is,string &str,char delim)
istream &is表示一個輸入流,譬如cin.
string表示把從輸入流讀入的字符串存放在這個字符串中(&str其實就是一個變量)
char delim是終止符(默認為回車,還可以是別的符號,如#,*之類的都可以)
而對於while(getline(cin,str))來講,while語句的真實判斷對象是cin,也就是當前是否存在有效的輸入流,如果存在就不會結束循環
getline(cin,str, '\n');
2.scanf讀入:
scanf函數不檢測讀入的字符的個數,僅僅是不斷的從標准輸入流(鍵盤)中讀入字符,直到遇到“空白符”.scanf不從輸入流中取出“空白符”.
1)讀入單個字符時讀入換行符空格什么的
使用scanf("%c", &ch); 讀取ch (ch是char類型),如果讀取之前有換行符或者空格,那么ch就會把之前的換行符或者空格讀取到,解決方法就是這之前先getchar()一下
2)讀取字符串時(不管字符串是char或者char[]都是可以的),並不會不會讀取前邊的換行符或者空格
使用scanf("%s",str); 讀取str (str是字符串類型),
如果讀取之前有換行符或者空格,str也不會把之前的換行符或者空格讀取到,所以使用它讀入字符串的時候可以大膽放心啦~
3)讀取二維char數組不能用scanf("%s", str[i][j]),但是是可以使用scanf("%s", str[i])或者scanf("%c",&str[i][j])的,相比較而言前者速度更快一些.
至於原因嘛:可能是數組名可以表示數組首地址的原因?
Eg:
scanf("%s",str[i]+1);
scanf("%c",&ch); /* 像第一行那樣讀入的時候就能夠強制的讓字符串從1號數組開始, 因為默認字符串的讀入都是從0號元素開始的, 並且有一點需要說明的是: scanf讀入字符串時不能夠加"&"號!
(但是在讀入單個字符時是必須要加上"&"符號的!) */
3.cin讀入:
不讀換行符
(是用空白(空格,制表符和換行符)來定字符串的界的)
Eg:
cin>>s; //不讀入換行符什么的,我感覺最好用啾啾啾~,但是……空格也是讀不進去的,這就有點……
4.fgets讀入:
讀入的是帶'\n'的字符串,一直進行讀取直到遇到'\n',並將'\n'從輸入流中取出.
(會讀入'\r' //空白符)
前提是(不超過第二個參數的情況下,它從第三個參數(文件指針,輸入流)中不斷的讀入字符).
5.gets讀入:
讀取空字符,並且還讀取換行符(這真的略尷尬……).
(還讀入'\r' //空白符)
它的讀入是不檢測讀入的字符的個數的.僅僅是不斷的從標准輸入流(鍵盤)中讀入字符,直到遇到'\n'.
與fgets不同的是,雖然gets函數也會將'\n'從輸入流中取出,但卻只是取出,然后將其丟掉.他是並不保存在目標字符串中的.
PS:
其中fgets函數是安全的,gets和scanf函數都是不安全的
當輸入的字符大於等於11時,會數組越界.編譯並不會保存,甚至運行時也不會保存.
但極可能因為對str數組越界寫入,導致更改了其他變量的值!
6.字符讀入getchar+字符輸出putchar函數:
getchar函數是接收從鍵盤輸入的單個字符數據,它是一個無參函數
用法:
ch=getchar();//通常把輸入的字符賦予一個字符變量,構成賦值語句 /* 1)只能接收單個字符,輸入數字也按照字符來處理 2)輸入多於一個時,只接收第一個 3)回車鍵結束 4)如果有連續兩個以上,應該一次性輸入所需字符,最后再按回車,否則,將進行接收回車,將其作為一個字符串給后面的getchar()函數 */
putchar函數是字符輸出函數,輸出單個字符
用法:
putchar(ch); //ch為字符變量或常量
如果實在看不懂的話可以出門拐角去百度一下,或者直接給你個鏈接?
http://blog.csdn.net/cyuyanenen/article/details/51602922
四.字典序
數字的字典序是說1 < 2 , 13 < 9;
而字母的字典序是說 zzz > zzx ,即26 26 26 > 26 26 25
依然是將他轉化為數字然后進行比較
五.字符串中lenth與find函數的用法
#include<cstdio> #include<iostream>
using namespace std; string a; int main() { cin>>a; int x=a.length(); printf("%d\n",x);//會輸出字符串的長度,不是從0開始記數
int y=a.find('q'); printf("%d\n",y); //會輸出字符串尋找‘q’這個字符的時候所遇到的第一個‘q’的地址,如果沒有,返回-1
return 0; }
六.指針!
看了一些資料,指向二維數組的指針定義方式並不是直接定義指針的指針
int a[3][6]; int **p=a;//像這樣定義是錯誤的
因為a代表着除了第一列以外的列數的維數大小,如a+1的地址就是a[1]的地址,也就是a[1][0]的地址,而p僅是整形指針的指針,沒跨越一次就是4字節,因此他們的大小是不匹配的,所以這樣子直接等於號是不正確的。
要真正的定義方式應概是定義指向n維數組的指針,n就是除第一維的另外維度,
如上面的指針定義應該為
int (*p)[6]; p=a;
這樣子就 可以就可以通過p以下標形式來訪問數組。
接下來給出一些比較簡單的代碼:
#include<cstdio> #include<iostream>
using namespace std; /* 指針的 相加或者相乘 */
int main() { int a,b,s,t; cin>>a>>b; int *p; p=&a; int *q; q=&b; s=(*p)+(*q); t=(*p)*(*q); printf("a=%d\n",*p); printf("b=%d\n",*q); printf("a+b=%d\n",s); printf("a*b=%d\n",t); return 0; }
七.map
http://www.cnblogs.com/zxqxwnngztxx/p/6701478.html
八.位運算
#include<iostream> #include<cstdio>
using namespace std; int main() { int q; cin>>q; int w=q<<1;//等價於q*2
int e=1<<q;//等價於2的q次方
int r=q>>1;//等價於q/2
int t=1>>q;//等價於0
cout<<w<<" "<<e<<" "<<r<<" "<<t; return 0; }
九.不給幾組數據的各種輸入方式
倘若若干組數據分別有m個輸入
下面所提到的(*m)均指執行多少次
1)EOF
while(scanf("%……*m",&……*m)!=EOF);
2)while(scanf("%……*m",&……*m)==m);
3)while(cin>>……*m);
十.break,continue,return的區別
1)break
直接跳出當前的循環,從當前循環外面開始執行,忽略循環體中任何其他語句和循環條件測試。他只能跳出一層循環;
注意:如果你的循環是嵌套循環,那么你需要按照你嵌套的層次,逐步使用break來跳出.
2)continue
也是終止當前的循環過程,但他並不跳出循環,而是繼續往下判斷循環條件執行語句.他只能結束循環中的一次過程,但不能終止循環繼續進行.
3)return
語句可被用來使 正在執行分支程序返回到調用它方法。
詳細的return在這里(http://www.cnblogs.com/zxqxwnngztxx/p/6758491.html)啦~
(未完待續?)
