- 具体的使用方法一般是自己配置,所有开关都在namespace 的开头。
- 然后在Linux下的mmap要求使用文件输入(提交前请关闭文件开关)。
- 如果使用了algorithm库请在max、min前加上::(如::max(a,b))。
- 如果有变量名冲突需要请取消namespace的注释,并且更改using部分。
- 这里的write、max、min在std>=c++11支持任意参数(N>=1)的运行,write默认使用cout,Split为分隔符。
- 如果有需要请自行调节,可以加上__inline__ __attribute__ ((always_inline))和extern优化。
- 注意尽量不要更改template部分,已经设计好了。
- 关于输出为什么需要用cout原因有4:可以自己适配类型,可以自己定义流输出,输出long long和某些类型速度比scanf快,快写的某些类型(例如double)不方便实现。
- 如有Bug请在评论区反馈,感谢您的反馈,作者也会不断更新。
- 讲解一下用法
- read、write快读快写,其中快写要求第一个参数为分隔字符
- max、min等工具(请自行决定打不打开namespace),upmax为更新最大值,upmin同理
- Queue和Stack(用法举例:Queue<int> mession(MAXN)(Queue<类型> 名字(大小)))(内存分配可能会有不少Bug)
- 讲解一下几个开关
- DEBUG_PORT:是否编译Debug代码
- DEBUG:是否使用Debug
- ONLINE_JUDGE:建议用在using namespace std后面,是否为在线测评,该开关改变DEBUG_PORT、NEED_FILE开关
- SF_READ:是否读负数(效率有影响)
- EOF_READ:是否判断EOF(读到EOF继续读不会RE)
- WRITE_ENDL:是否在write后输出换行
- FAST_WRITE:是否使用快写(目前支持所有整数)
- WRITE_SPLIT:是否把write输入的第一个参数作为后面参数两两间的分割符
- NEED_FILE:是否使用文件输入输出
- __gnu_linux:系统定义的,检查是否为linux系统
- 注意linux下如果使用mmap那么必须使用文件输入输出
- 注意声明Main_Guard如果没有参数的时候不要在后面加一个小括号,否则编译器会产生歧义而不报错,因为编译器可以认为是声明为了一个返回值为Main_Guard的函数
版本线:发布-->修复一些Windows下的错误-->修复template,增强template-->(预计)增多快读支持类型-->增强快读,longlong等支持(多方法调用)-->增强文件操作,using::swap似乎有Bug,增加write输出方式-->实用改进-->修复一些Bug-->支持快速手写队列、栈-->增加小数读入支持-->修复Bug(然而在Luogu的测评环境下一直检测不到DONLINE_JUDGE也是一个比较严重的问题......)-->修复不少Bug,增加Debug工具-->修复ONLINE_JUDGE检测-->把Main_Init换成了Main_Guard,所以只要在int main()开始的时候开一个结构体即可-->把队列和栈的数字大小写成模板参数,加速-->删除了一些没有必要的警告
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //Created By Creeper_LKF 2 //Caution::We used "pragma" in the code 3 #include <cstdio> 4 #include <cctype> 5 #include <cassert> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 10 #ifdef __gnu_linux__ 11 12 #include <fcntl.h> 13 #include <unistd.h> 14 #include <sys/mman.h> 15 16 #endif 17 18 #if __cplusplus < 201103L 19 20 #include <stdarg.h> 21 22 #endif 23 24 //Algorithm Heads 25 26 27 using namespace std; 28 29 //Debug Port 30 31 // #define DEBUG_PORT 32 #define DEBUG 33 34 #ifdef ONLINE_JUDGE 35 #undef DEBUG_PORT 36 #undef DEBUG 37 #endif 38 39 #ifdef DEBUG_PORT 40 #if __cplusplus >= 201103L 41 #ifdef DEBUG 42 template<typename T> 43 extern inline void Debug(T tar){ 44 cerr << tar << endl; 45 } 46 template<typename Head, typename T, typename... Tail> 47 extern inline void Debug(Head head, T mid, Tail... tail){ 48 cerr << head << ' '; 49 Debug(mid, tail...); 50 } 51 #else 52 template<typename Head, typename T, typename... Tail> 53 extern inline void Debug(Head, T, Tail...){ 54 return ; 55 } 56 #endif 57 #else 58 # pragma message "Warning : C++11 Not Use" 59 #ifdef DEBUG 60 template <typename T> 61 extern inline void Debug(T tar){ 62 cerr << tar << endl; 63 } 64 #else 65 template <typename T> 66 extern inline void Debug(T){ 67 return ; 68 } 69 #endif 70 #endif 71 #else 72 template<typename Head, typename T, typename... Tail> 73 extern inline void Debug(Head, T, Tail...){ 74 return ; 75 } 76 template <typename T> 77 extern inline void Debug(T){ 78 return ; 79 } 80 #endif 81 82 const char file_name[] = "b"; 83 84 #define NAME_SPACE 85 #define USING 86 87 #ifdef NAME_SPACE 88 namespace LKF{ 89 #endif 90 #define SF_READ 91 #define EOF_READ 92 // #define ONLINE_JUDGE 93 #define WRITE_ENDL 94 // #define FAST_WRITE 95 #define SPLIT_WRITE 96 const size_t MAX_BUF_SIZE = 50000000; 97 98 #define NEED_FILE 99 100 #ifdef FAST_WRITE 101 char outp[MAX_BUF_SIZE], *op = outp; 102 #endif 103 104 #ifdef ONLINE_JUDGE 105 #undef NEED_FILE 106 #endif 107 108 #ifdef FAST_WRITE 109 #ifndef WRITE_ENDL 110 #define WRITE_ENDL 111 #endif 112 #endif 113 114 extern inline void FILE_OPT(){ 115 #ifdef NEED_FILE 116 #define FILE_NAME file_name 117 char IN_FILE[sizeof(FILE_NAME) + 5], OUT_FILE[sizeof(FILE_NAME) + 5]; 118 strcpy(IN_FILE, FILE_NAME), strcpy(OUT_FILE, FILE_NAME); 119 strcat(IN_FILE, ".in"), strcat(OUT_FILE, ".out"); 120 freopen(IN_FILE, "r", stdin); 121 freopen(OUT_FILE, "w", stdout); 122 #endif 123 } 124 125 #ifdef __gnu_linux__ 126 127 char *pc; 128 129 struct Main_Guard{ 130 Main_Guard(){ 131 #ifndef ONLINE_JUDGE 132 FILE_OPT(); 133 pc = (char *) mmap(NULL, lseek(0, 0, SEEK_END), PROT_READ, MAP_PRIVATE, 0, 0); 134 #endif 135 } 136 ~ Main_Guard(){ 137 #ifdef FAST_WRITE 138 fwrite(outp, 1, op - outp, stdout); 139 #endif 140 fclose(stdin), fclose(stdout); 141 } 142 }; 143 144 #else 145 146 char buf[MAX_BUF_SIZE], *pc = buf; 147 148 struct Main_Guard{ 149 Main_Guard(){ 150 FILE_OPT(); 151 fread(buf, 1, MAX_BUF_SIZE, stdin); 152 } 153 ~ Main_Guard(){ 154 #ifdef FAST_WRITE 155 fwrite(outp, 1, op - outp, stdout); 156 #endif 157 fclose(stdin), fclose(stdout); 158 } 159 }; 160 161 #endif 162 163 inline char read_ch(){ 164 char c; 165 while(isspace(c = *pc ++)); 166 return c; 167 } 168 169 #ifdef EOF_READ 170 171 #ifdef SF_READ 172 173 template<typename T> 174 static inline void read(T &num){ 175 num = 0; 176 char c, sf = 1; 177 while(isspace(c = *pc++)); 178 if(c == 45) sf = -1, c = *pc ++; 179 while(num = num * 10 + c - 48, isdigit(c = *pc++)); 180 num *= sf; 181 } 182 183 static inline int read(){ 184 int num = 0; 185 char c, sf = 1; 186 while(isspace(c = *pc++)); 187 if(c == 45) sf = -1, c = *pc ++; 188 while(num = num * 10 + c - 48, isdigit(c = *pc++)); 189 return num * sf; 190 } 191 192 static inline double read_dec(){ 193 double num = 0, decs = 1; 194 char c, sf = 1; 195 while(isspace(c = *pc ++)); 196 if(c == '-') sf = -1, c = *pc ++; 197 while(num = num * 10 + c - 48, isdigit(c = *pc ++)); 198 if(c != '.') return num * sf; 199 c = *pc ++; 200 while(num += (decs *= 0.1) * (c - 48), isdigit(c = *pc ++)); 201 return num * sf; 202 } 203 204 #else 205 206 template<typename T> 207 static inline T read(T &num){ 208 num = 0; 209 char c; 210 while (isspace(c = *pc++)); 211 while (num = num * 10 + c - 48, isdigit(c = *pc++)); 212 return num; 213 } 214 215 static inline int read(){ 216 int num = 0; 217 char c; 218 while (isspace(c = *pc++)); 219 while (num = num * 10 + c - 48, isdigit(c = *pc++)); 220 return num; 221 } 222 223 static inline double read_dec(){ 224 double num = 0, decs = 1; 225 char c; 226 while(isspace(c = *pc ++)); 227 while(num = num * 10 + c - 48, isdigit(c = *pc ++)); 228 if(c != '.') return num; 229 c = *pc ++; 230 while(num += (c - 48) * (decs *= 0.1), isdigit(c = *pc ++)); 231 return num; 232 } 233 234 #endif 235 236 #else 237 238 #ifdef SF_READ 239 240 template<typename T> 241 static inline void read(T &num){ 242 num = 0; 243 char c, sf = 1; 244 while((c = *pc++) < 45); 245 if(c == 45) sf = -1, c = *pc ++; 246 while(num = num * 10 + c - 48, (c = *pc++) >= 48); 247 num *= sf; 248 } 249 250 static inline int read(){ 251 int num = 0; 252 char c, sf = 1; 253 while((c = *pc++) < 45); 254 if(c == 45) sf = -1, c = *pc ++; 255 while(num = num * 10 + c - 48, (c = *pc++) >= 48); 256 return num * sf; 257 } 258 259 static inline double read_dec(){ 260 double num = 0, decs = 1; 261 char c, sf = 1; 262 while(isspace(c = *pc ++)); 263 if(c == '-') sf = -1, c = *pc ++; 264 while(num = num * 10 + c - 48, isdigit(c = *pc ++)); 265 if(c != '.') return num * sf; 266 c = *pc ++; 267 while(num += (decs *= 0.1) * (c - 48), isdigit(c = *pc ++)); 268 return num * sf; 269 } 270 271 #else 272 273 template<typename T> 274 static inline T read(T &num){ 275 num = 0; 276 char c; 277 while ((c = *pc++) < 48); 278 while (num = num * 10 + c - 48, (c = *pc++) >= 48); 279 return num; 280 } 281 282 static inline int read(){ 283 int num = 0; 284 char c; 285 while ((c = *pc++) < 48); 286 while (num = num * 10 + c - 48, (c = *pc++) >= 48); 287 return num; 288 } 289 290 static inline double read_dec(){ 291 double num = 0, decs = 1; 292 char c; 293 while(isspace(c = *pc ++)); 294 while(num = num * 10 + c - 48, isdigit(c = *pc ++)); 295 if(c != '.') return num; 296 c = *pc ++; 297 while(num += (c - 48) * (decs *= 0.1), isdigit(c = *pc ++)); 298 return num; 299 } 300 301 #endif 302 303 #endif 304 305 #ifdef FAST_WRITE 306 template <typename T> 307 inline void Call_Write(char Split, T tar){ 308 char buf[20]; 309 int top = 0; 310 if(tar == 0) *op ++ = 48; 311 else { 312 if(tar < 0) *op ++ = '-', tar = -tar; 313 while(tar) buf[++top] = tar % 10, tar /= 10; 314 while(top) *op ++ = buf[top --] ^ 48; 315 } 316 *op ++ = Split; 317 } 318 template <typename T> 319 inline void Call_Write(T tar){ 320 char buf[20]; 321 int top = 0; 322 if(tar == 0) *op ++ = 48; 323 else { 324 if(tar < 0) *op ++ = '-', tar = -tar; 325 while(tar) buf[++top] = tar % 10, tar /= 10; 326 while(top) *op ++ = buf[top --] ^ 48; 327 } 328 } 329 #endif 330 331 #ifdef FAST_WRITE 332 333 extern inline void write(){ 334 *op ++ = '\n'; 335 } 336 337 template<typename T> 338 extern inline void write(T tar){ 339 Call_Write(tar); 340 #ifdef WRITE_ENDL 341 write(); 342 #endif 343 } 344 345 #if __cplusplus >= 201103L 346 347 template<typename T> 348 extern inline void write(char, T tar){ 349 Call_Write(tar); 350 #ifdef WRITE_ENDL 351 write(); 352 #endif 353 } 354 355 template<typename Head, typename T, typename... Tail> 356 extern inline void write(char Split, Head head, T mid, Tail... tail){ 357 Call_Write(Split, head); 358 write(Split, mid, tail...); 359 } 360 361 #else 362 363 template <typename T> 364 extern inline void write(char Split, T tar){ 365 Call_Write(tar); 366 #ifdef WRITE_ENDL 367 write(); 368 #endif 369 } 370 371 #endif 372 373 #else 374 375 extern inline void write(){ 376 cout << endl; 377 } 378 379 template<typename T> 380 extern inline void write(T tar){ 381 cout << tar; 382 #ifdef WRITE_ENDL 383 write(); 384 #endif 385 } 386 387 #if __cplusplus >= 201103L 388 389 template<typename T> 390 extern inline void write(char Split, T tar){ 391 cout << tar << Split; 392 #ifdef WRITE_ENDL 393 write(); 394 #endif 395 } 396 397 template<typename Head, typename T, typename... Tail> 398 extern inline void write(char Split, Head head, T mid, Tail... tail){ 399 #ifdef SPLIT_WRITE 400 cout << head << Split; 401 #else 402 cout << head; 403 #endif 404 write(Split, mid, tail...); 405 } 406 407 #else 408 409 template <typename T> 410 extern inline void write(char Split, T tar){ 411 cout << tar << Split; 412 #ifdef WRITE_ENDL 413 write(); 414 #endif 415 } 416 417 #endif 418 419 #endif 420 421 template <typename T> 422 extern inline void upmax(T &x, const T &y){ 423 if(x < y) x = y; 424 } 425 template <typename T> 426 extern inline void upmin(T &x, const T &y){ 427 if(x > y) x = y; 428 } 429 430 #if __cplusplus >= 201103L 431 432 template<typename T> 433 extern inline T max(T tar){ 434 return tar; 435 } 436 437 template<typename T> 438 extern inline T min(T tar){ 439 return tar; 440 } 441 442 template <typename Head, typename T, typename... Tail> 443 extern inline Head max(Head head, T mid, Tail... tail){ 444 Head tmp = max(mid, tail...); 445 return head > tmp ? head : tmp; 446 } 447 template <typename Head, typename T, typename... Tail> 448 extern inline Head min(Head head, T mid, Tail... tail){ 449 Head tmp = min(mid, tail...); 450 return head < tmp ? head : tmp; 451 } 452 453 #else 454 455 template <typename T> 456 extern inline T max(T a, T b){ 457 return a > b ? a : b; 458 } 459 template <typename T> 460 extern inline T min(T a, T b){ 461 return a < b ? a : b; 462 } 463 464 #endif 465 466 template <typename T> 467 extern inline T abs(T tar){ 468 return tar < 0 ? -tar : tar; 469 } 470 template <typename T> 471 extern inline void swap(T &a, T &b){ 472 T t = a; 473 a = b; 474 b = t; 475 } 476 #ifdef NAME_SPACE 477 } 478 #endif 479 480 //Algorithm 481 482 #ifdef NAME_SPACE 483 namespace LKF{ 484 #endif 485 486 template <class Tn, size_t ArraySize> 487 struct Queue{ 488 size_t s, t; 489 Tn q[ArraySize]; 490 Queue(){ 491 s = 1, t = 0; 492 } 493 inline void clear(){ 494 s = 1, t = 0; 495 } 496 inline bool empty(){ 497 return s > t; 498 } 499 inline size_t size(){ 500 return t - s + 1; 501 } 502 inline void push(Tn tar){ 503 q[++ t] = tar; 504 } 505 inline void pop_front(){ 506 s ++; 507 } 508 inline void pop_back(){ 509 t --; 510 } 511 inline Tn front(){ 512 return q[s]; 513 } 514 inline Tn back(){ 515 return q[t]; 516 } 517 }; 518 519 template <class Tn, size_t ArraySize> 520 struct Stack{ 521 size_t t; 522 Tn s[ArraySize]; 523 Stack(){ 524 t = 0; 525 } 526 inline void clear(){ 527 t = 0; 528 } 529 inline bool empty(){ 530 return t == 0; 531 } 532 inline size_t size(){ 533 return t; 534 } 535 inline void push(Tn tar){ 536 s[++ t] = tar; 537 } 538 inline Tn top(){ 539 return s[t]; 540 } 541 inline void pop(){ 542 t --; 543 } 544 }; 545 546 #ifdef NAME_SPACE 547 } 548 #endif 549 550 #ifdef USING 551 552 #ifdef NAME_SPACE 553 using LKF::pc; 554 using LKF::read_ch; 555 using LKF::read_dec; 556 using LKF::read; 557 using LKF::write; 558 using LKF::upmax; 559 using LKF::upmin; 560 using LKF::max; 561 using LKF::min; 562 using LKF::abs; 563 // using LKF::swap; 564 #else 565 using ::pc; 566 using ::read_ch; 567 using ::read_dec; 568 using ::read; 569 using ::write; 570 using ::upmax; 571 using ::upmin; 572 using ::max; 573 using ::min; 574 using ::abs; 575 // using ::swap; 576 #endif 577 578 #endif 579 580 //Source Code