洛谷 T59576 下一個迴文樹(zhoutbafo)
阿新 • • 發佈:2021-08-10
嗯,一道私題,一道大模擬,細節巨多,ztb學長建議我們做的,有助於提高碼力。
nekko哥哥寫了6.73k的程式碼。
我個人認為我碼力非常的差QWQ,於是就寫了。
調了一下午,總算是調出來了。
呼~好有成就感。
我也不打算寫題解了(一道大模擬有什麼好寫的,是吧),只是為了紀念一下。
當然需要的話也可以拿去對拍。
程式碼(2.94k)
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define zuo(x) x #define you(x) 2 * mid - x + (!t) using namespace std; const int N = 2e5 + 10; int T, flag, xiaoshu; int a[N], b[N], c[N], d[N]; int z[N], x[N]; char s[N]; int jinwei, bj9, fu; void init(){ scanf("%s", s + 1); int len = strlen(s + 1); int st = 0, pos = 0, End = len; if(s[1] == '-') fu = 1, st = 1; for(int i = 1 + st; i <= len; i++){ if(s[i] == '.'){ pos = i; break; } } if(pos) for(int i = 1 + st; i < pos; i++) a[i - st] = s[pos - i + st] - '0'; else for(int i = 1 + st; i <= len; i++) a[i - st] = s[len - i + st + 1] - '0'; a[0] = pos ? pos - st - 1: len - st; memcpy(c, a, sizeof(a)); if(!pos) return; while(s[End] == '0') End--; if(End - pos) xiaoshu = 1; for(int i = pos + 1; i <= End; i++) b[i - pos] = s[End - (i - pos) + 1] - '0'; b[0] = End - pos; } void solve(int a[]){ int mid = (a[0] + 1) >> 1; int t = a[0] & 1; //t=0表示長度為偶數,t=1表示長度為奇數 for(int i = mid; i >= 1; i--){ if(a[zuo(i)] != a[you(i)]){ flag = 0; break; } }; int i = mid; if(flag){ while(a[zuo(i)] == 9 && zuo(i) >= 1) bj9++, i--; if(bj9 == mid){ jinwei = 1; c[1] = 1; for(int i = 2; i <= c[0]; i++) c[i] = 0; c[++c[0]] = 1; } else{ if(zuo(i) != you(i)) a[zuo(i)]++, a[you(i)]++; else a[zuo(i)]++; } }else{ while(a[zuo(i)] == a[you(i)]) bj9 += (a[zuo(i)] == 0), i--; if(a[zuo(i)] < a[you(i)]){ for(int j = zuo(i); j >= 1; j--) a[j] = a[2 * mid - j + (!t)]; }else{ int res = mid; while(a[zuo(res)] == a[you(res)] && a[res] == 9) res--; a[zuo(res)] = a[you(res)] = a[you(res)] + 1; for(int j = zuo(res) - 1; j >= 1; j--) a[zuo(j)] = a[you(j)]; for(int j = zuo(res) + 1; j <= you(res) - 1; j++) a[j] = 0; } } } void gsub(int a[], int b[], int c[], int d[]){ int i; if(xiaoshu) c[1]--; for(i = 1; i <= c[0]; i++){ if(c[i] < a[i]){ c[i] += 10; c[i + 1]--; } c[i] -= a[i]; } while(!c[c[0]] && c[0] > 0) c[0]--; if(xiaoshu){ d[0] = b[0] + 1; d[d[0]] = 1; for(i = 1; i <= d[0]; i++){ if(d[i] < b[i]){ d[i] += 10; d[i + 1]--; } d[i] -= b[i]; } d[0]--; } } int main(){ scanf("%d", &T); while(T--){ memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); memset(d, 0, sizeof(d)); jinwei = bj9 = xiaoshu = fu = 0; flag = 1; init(); if(fu){ a[1]++; int pos = 1; while(a[pos] >= 10){ a[pos] = 0; a[++pos]++; } if(pos > a[0]) a[0] = pos; for(int i = a[0]; i >= 1; i--) printf("%d", a[i]); if(xiaoshu){ if(!a[0]) printf("0"); printf("."); for(int i = b[0]; i >= 1; i--) printf("%d", b[i]); } printf("\n"); continue; } solve(c); gsub(a, b, c, d); for(int i = c[0]; i >= 1; i--) printf("%d", c[i]); if(xiaoshu){ if(!c[0]) printf("0"); printf("."); for(int i = d[0]; i >= 1; i--) printf("%d", d[i]); } printf("\n"); } return 0; }
本文來自部落格園,作者:{xixike},轉載請註明原文連結:https://www.cnblogs.com/xixike/p/15125396.html