1. 程式人生 > 其它 >C++快讀快寫啊啊啊啊

C++快讀快寫啊啊啊啊

一般scanf,printf可以應對大部分的題,但一道題目資料量特別大,就要用到快讀快寫模板

通過讀入字元而後來轉成數字,而原理就是讀入字元比數字快。

快讀:

int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
快寫:
void write(int x) {
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

懶猴…………

某日逛潮水東南落(CSDN)
原文連結(fjzg):https://blog.csdn.net/qq_41996523/article/details/99539179

完整的讀寫模板(新式???)

#define USEFASTERREAD 1

#define rg register
#define inl inline
#define DEBUG printf("qwq\n")
#define DEBUGd(x) printf("var %s is %lld", #x, ll(x))
#define DEBUGf(x) printf("var %s is %llf", #x, double(x))
#define putln putchar('\n')
#define putsp putchar(' ')
#define Rep(a, s, t) for(rg int a = s; a <= t; a++)
#define Repdown(a, t, s) for(rg int a = t; a >= s; a--)
typedef long long ll;
typedef unsigned long long ull;
#include<cstdio>

#if USEFASTERREAD
char In[1 << 20], *ss = In, *tt = In;
#define getchar() (ss == tt && (tt = (ss = In) + fread(In, 1, 1 << 20, stdin), ss == tt) ? EOF : *ss++)
#endif
namespace IO {
	inl void RS() {freopen("test.in", "r", stdin), freopen("test.out", "w", stdout);}
	inl ll read() {
		ll x = 0, f = 1; char ch = getchar();
		for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
		for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');
		return x * f;
	}
	inl void write(ll x) {
		if(x < 0) {putchar('-'); x = -x;}
		if(x >= 10) write(x / 10);
		putchar(x % 10 + '0');
	}
	inl void writeln(ll x) {write(x), putln;}
	inl void writesp(ll x) {write(x), putsp;}
}
using namespace IO;
template<typename T> inline T Max(const T& x, const T& y) {return y < x ? x : y;}
template<typename T> inline T Min(const T& x, const T& y) {return y < x ? y : x;}
template<typename T> inline void Swap(T& x, T& y) {T tmp = x; x = y; y = tmp;}
template<typename T> inline T Abs(const T& x) {return x < 0 ? -x : x;}

基本快讀快寫(舊式[什麼鬼e]

struct IO
{
	IO(int set = 0) {if(set) rs;} 
	void RS() {rs;} 
	template<typename T> inline IO r(T& x)const
	{
	    x = 0; T f = 1; char ch = getchar();
	    for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
	    for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');
	    x *= f; return *this;
	}
	template<typename T> inline IO w(T x)const
	{
	    if(x < 0) {putchar('-'); x = -x;}
	    if(x >= 10) w(x / 10);
	    putchar(x % 10 + '0'); return *this;
	}
	template<typename T> inline IO wl(const T& x)const {w(x), putline; return *this;}
	template<typename T> inline IO ws(const T& x)const {w(x), putsp; return *this;}
	inline IO l() {putline; return *this;}
	inline IO s() {putline; return *this;}
}io;

更快的快讀

程式碼(ha)

只要在基本的快讀前加上

#define getchar() (tt == ss && (tt = (ss = In) + fread(In, 1, 1 << 20, stdin), ss == tt) ? EOF : *ss++)
char In[1 << 20], *ss=In, *tt=In;

???

聽一下dalao的解釋
In[]:用來快取輸入的東西的一個緩衝區

ss:指向當前讀到的元素
tt:指向緩衝區的末尾

重定義的getchar()函式詳解:
1)若\(ss!=tt\), 代表緩衝區還沒讀完,直接返回$$*ss$$,然後再\(ss++\)即可
2)若\(ss==tt\),代表緩衝區已經讀完
此時將\(ss\)重新賦值為\(In\),然後\(tt\)賦值為\(ss+\)讀入了的元素個數
a.若此時還是\(ss==tt\),說明讀入的字元個數為0,讀不出東西了,到了檔案末尾,返回\(EOF\)(檔案末尾識別符號)
b.否則返回\(*ss\),然後再\(ss++\)即可

此快讀使用注意:

1)這個快讀的效率不知道比系統自帶的\(getchar()\)高多少2333
2)根據題目所給的空間注意char In[]的大小,不要\(MLE\)了!
3)此快讀一般用於檔案讀寫。若要使用控制檯,則應該在輸入所有資料後使用Ctrl+Z輸入\(EOF\)
4)考場上如果寫不對不如不寫,反正沒有哪個出題人喪心病狂到卡起了系統自帶的\(getchar()\)
5)使用了這個快讀,就不能用系統自帶的\(getchar(),scanf(),cin\)之類的輸入方法了

(因為它是搬運檔案內容,一次搬一堆)

問一下

\[{\colorbox{Red}{{\colorbox{Orange}{{\colorbox{Gold}{{\colorbox{yellow}{{\colorbox{GreenYellow}{{\colorbox{LimeGreen}{{\colorbox{Turquoise}{{\colorbox{Aquamarine}{{\colorbox{CornflowerBlue}{{\colorbox{Blue}{{\colorbox{BlueViolet}{{\color{white}\colorbox{DarkOrchid}{尼姑的陰間md排版,不考慮原始碼嗎啊啊啊啊啊啊啊}}}}}}}}}}}}}}}}}}}}}}}{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} \]\[{\colorbox{Red}{{\colorbox{Orange}{{\colorbox{Gold}{{\colorbox{yellow}{{\colorbox{GreenYellow}{{\colorbox{LimeGreen}{{\colorbox{Turquoise}{{\colorbox{Aquamarine}{{\colorbox{CornflowerBlue}{{\colorbox{Blue}{{\colorbox{BlueViolet}{{\color{white}\colorbox{DarkOrchid}{而且,既然是白嫖的是不是要公開原始碼啊啊啊啊啊啊}}}}}}}}}}}}}}}}}}}}}}}{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{{}_{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} \]

…………………………………………………………………………………………………………

OKOK

md程式碼在剪下板
https://www.luogu.com.cn/paste/9z8owh48