为什么前几年的IOI题都是这样子的!!!
我们手推一下:
s1 + s2 = 2 * m1, s2 + s3 = 2 * m2, s3 + s4 = 2 * m3...
于是可以用s1, m1, m2, m3...表示出s2, s3, s4...
s2 = 2 * m1 - s1, s3 = 2 * m2 - 2 * m1 + s1, s4 = 2 * m3 - 2 * m2 + 2 * m1 - s1...
由条件si-1 ≤ si可以推出:
s1 ≤ m1, s1 ≥ m1 + (m1 - m2), s1 ≤ m1 + (m1 - m2) - (m2 - m3) ...
不难发现,上面的步骤都是等价的
然后就没有然后了,加个究极读入优化什么的就可以rank排在前面了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /************************************************************** 2 Problem: 1811 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:628 ms 7 Memory:49632 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 using namespace std; 14 typedef long long ll; 15 const ll inf = (ll)1e60; 16 const int Maxlen = 5000000 * 10; 17 18 char buf[Maxlen], *c = buf; 19 int Len; 20 int n; 21 ll now, mx, mn; 22 23 int read() { 24 int x = 0; 25 while (*c < '0' || '9' < *c) ++c; 26 while ('0' <= *c && *c <= '9') 27 (x *= 10) += *c - '0', ++c; 28 return x; 29 } 30 31 int main() { 32 Len = fread(c, 1, Maxlen, stdin); 33 buf[Len] = '\0'; 34 int i, x = 0, y = 0; 35 n = read(); 36 mx = inf, mn = -inf; 37 for (i = 1; i <= n; ++i, y = x) { 38 x = read(); 39 if (i & 1) mx = min(mx, now += x - y); 40 else mn = max(mn, now += y - x); 41 } 42 printf("%lld\n", mx < mn ? 0 : mx - mn + 1); 43 return 0; 44 }
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen