正常版,输入输出优化比较正常,无论是scanf/printf/cin/cout都可以混用
用法:int x=gi; pint(x); 类似这样。
#define gc getchar() int g_i() { int tmp=0; bool fu=0; char s; while(s=gc,s!=‘-‘&&(s<‘0‘||s>‘9‘)) ; if(s==‘-‘) fu=1; else tmp=s-‘0‘; while(s=gc,s>=‘0‘&&s<=‘9‘) tmp=tmp*10+s-‘0‘; if(fu) return -tmp; else return tmp; } #define gi g_i() #define pob #define pc(x) putchar(x) namespace ib {char b[100];} inline void pint(int x) { if(x==0) {pc(48); pc(10); return;} if(x<0) {pc(‘-‘); x=-x;} char *s=ib::b; while(x) *(++s)=x%10, x/=10; while(s!=ib::b) pc((*(s--))+48); pc(10); }
丧病版,输入优化采用fgets,不能与cin/scanf混用,如果需要读入其他类型可能需要手写。
输出优化的行为有一些奇怪,它会把输出缓存到一定数量之后一起输出,可以用pob把缓存中的字符输出,调试时可能需要注意一下(比如多个询问的题目答案可能会在最后一起输出)
用法也是:int x=gi; pint(x); 如果需要把缓存中的内容输出清空就用pob;
输入输出缓存大小可以用BUFSIZE这个宏来控制。
#define BUFSIZE 300000 namespace fib {char b[BUFSIZE]={},*f=b;} #define gc ((*fib::f)?(*(fib::f++)):(fgets(fib::b,sizeof(fib::b),stdin)?(fib::f=fib::b,*(fib::f++)):-1)) int g_i() { int tmp=0; bool fu=0; char s; while(s=gc,s!=‘-‘&&(s<‘0‘||s>‘9‘)) ; if(s==‘-‘) fu=1; else tmp=s-‘0‘; while(s=gc,s>=‘0‘&&s<=‘9‘) tmp=tmp*10+s-‘0‘; if(fu) return -tmp; else return tmp; } #define gi g_i() namespace fob {char b[BUFSIZE]={},*f=b,*g=b+BUFSIZE-2;} #define pob (fwrite(fob::b,sizeof(char),fob::f-fob::b,stdout),fob::f=fob::b,0) #define pc(x) (*(fob::f++)=(x),(fob::f==fob::g)?pob:0) struct foce {~foce() {pob; fflush(stdout);}} _foce; namespace ib {char b[100];} inline void pint(int x) { if(x==0) {pc(48); pc(10); return;} if(x<0) {pc(‘-‘); x=-x;} char *s=ib::b; while(x) *(++s)=x%10, x/=10; while(s!=ib::b) pc((*(s--))+48); pc(10); }
在许多oj上都交过,正确性应该没什么问题。
时间: 2024-11-09 10:15:13