为什么前几年的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排在前面了。

 

 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 }
View Code

 

posted on 2015-01-28 21:15  Xs酱~  阅读(208)  评论(0编辑  收藏  举报