zoukankan      html  css  js  c++  java
  • BZOJ1811 [Ioi2005]mea

    为什么前几年的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] = '';
    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
    ", mx < mn ? 0 : mx - mn + 1);
    43   return 0;
    44 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    小猫爬山
    方格取数
    Bash 脚本编程
    树链剖分学习笔记
    输入输出优化
    没有上司的舞会
    线性dp 之 麻烦的聚餐
    飞翔
    挖地雷
    The Prices
  • 原文地址:https://www.cnblogs.com/rausen/p/4257120.html
Copyright © 2011-2022 走看看