题目有问题

P1912 [NOI2009] 诗人小G

kkk曾经在某地说过,【题目待添加】的意思是题目被和谐了。。。
by ceba_robot @ 2016-07-21 15:46:55


```cpp #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <string> #include <cmath> typedef long long int64; const int maxN = 100010, maxL = 60010; const int64 INF = 0x3f3f3f3f3f3f3f3fLL; const int64 LIM = int64(1e18); struct Stack { int L, R, pos; Stack() {} Stack(int L, int R, int pos): L(L), R(R), pos(pos) {} } sta[maxN]; double F[maxN]; char poem[maxN][40]; int g[maxN], T, n, top, p; int64 sum[maxN], f[maxN], len; void printI64(int64 x) { static const int64 MOD = 1000000000; if (x / MOD) printf("%d%09d", int(x / MOD), int(x % MOD)); else printf("%d", int(x)); return; } inline int64 pow(int64 a, int n) { int64 ans = 1, tmp = a; for (; n; n >>= 1, tmp *= tmp) if (n & 1) { if (double(ans) * double(tmp) > LIM) return INF; ans *= tmp; } return ans; } inline double pow(double a, int n) { double ans = 1, tmp = a; for (; n; n >>= 1, tmp *= tmp) if (n & 1) ans *= tmp; return ans; } void print(int i) { if (g[i]) print(g[i]); for (int k = g[i] + 1; k < i; ++k) printf("%s ", poem[k]); printf("%s\n", poem[i]); } inline int64 getf(int i, int j) { int64 tmp = pow(std::abs(i - j - 1 + sum[i] - sum[j] - len), p); return (double)tmp + f[j] > LIM ? INF : tmp + f[j]; } inline double getF(int i, int j) {return pow((double)std::abs(i - j - 1 + sum[i] - sum[j] - len), p) + F[j];} inline void update(int i) { while (i < sta[top].L && getF(sta[top].L, i) < getF(sta[top].L, sta[top].pos)) sta[top - 1].R = sta[top].R, --top; int L = sta[top].L, R = sta[top].R, p = R; if (i >= L) L = i + 1; while (L < R) { int Mid = (L + R) >> 1; if (getF(Mid, i) < getF(Mid, sta[top].pos)) p = R = Mid; else L = Mid + 1; } if (p < sta[top].R) sta[top + 1] = Stack(p, sta[top].R, i), sta[top++].R = p; return; } int main() { scanf("%d", &T); while (T--) { scanf("%d%d%d", &n, &len, &p); for (int i = 1; i < n + 1; ++i) scanf("%s", poem[i]), sum[i] = sum[i - 1] + strlen(poem[i]); sta[top = 1] = Stack(1, n + 1, 0); for (int i = 1, j = 1; i < n + 1; ++i) { if (i >= sta[j].R) ++j; F[i] = getF(i, g[i] = sta[j].pos); update(i); } if (F[n] > LIM) printf("Too hard to arrange\n"); else { for (int i = 1; i < n + 1; ++i) f[i] = getf(i, g[i]); printI64(f[n]); printf("\n"); print(n); } printf("--------------------\n"); } return 0; } 我过了20分 ```
by 3505515693qq @ 2017-01-17 10:25:57


|