Problem E. Minima
Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://codeforces.com/gym/100342/attachments

Description

You are given an array x[1 . . . n] and a number m. For all i from 1 to n−m+ 1 find the minimum among x[i], x[i + 1], . . . , x[i + m − 1] and return the sum of those minima.

Input

The first line of the input file contains three integer numbers: n, m and k (1 ≤ n ≤ 30 000 000, 1 ≤ m ≤ n, 2 ≤ k ≤ min(n, 1000)). The second line of the input file contains three integer numbers: a, b and c (−2 31 ≤ a, b, c ≤ 2 31 − 1). The third line of the input file contains k integer numbers: x[1], x[2], . . . , x[k] (−2 31 ≤ x[i] ≤ 2 31 − 1).
The rest of the array is calculated using the following formula: x[i] = f(a · x[i − 2] + b · x[i − 1] + c). Here f(y) returns such number −2 31 ≤ z ≤ 2 31 − 1 that y − z is divisible by 232
.

Output

Print one integer number — the sum of minima of all subarrays of length m of the given array.

Sample Input

10 3 2
1 1 0
0 1

Sample Output

33

HINT

 

题意

给你一个公式,然后可以推出剩下的数,然后问你m长的连续的序列的最小和为多少

题解

直接暴力就好了= =

不要想多了,直接暴力……

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <string>
#include <ctime>
#include <list>
typedef unsigned char byte;
#define pb push_back
#define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
#define local freopen("in.txt","r",stdin)
#define pi acos(-1)

using namespace std;
const int maxn = 3e7 + 500;
const long long MAX = (1LL<<31) - 1;
const long long MIN = -(1LL<<31);
const long long STD = 1LL << 32;
const long long TR = 1ll << 31;
long long a, b , c , ans = 0  ,front = 0 , rear = 0;
int p[maxn] , q[maxn];
int n , m , k;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}


int main(int argc,char *argv[])
{
    freopen("minima.in","r",stdin);
    freopen("minima.out","w",stdout);
  //local;
  //cout <<( (-7)%5) << endl;
  //return 0;
  scanf("%d%d%d%I64d%I64d%I64d",&n,&m,&k,&a,&b,&c);
  for(int i = 1 ; i <= k ; ++ i) p[i]=read();
  for(int i = k + 1 ; i <= n ; ++ i)
  {
       long long newval = 1LL * p[i-2] * a + p[i - 1] * b + c;
       if (newval < 0)
       {
           if(-newval>=STD) newval = newval % STD ;
           if(newval<-TR) newval+=STD;
       }
       else
       {
           if(newval>=STD) newval = newval % STD ;
           if(newval>=TR) newval-=STD;
       }
       p[i] = newval;
  }
  if (m > n) m = n;
  q[rear++] = 1;
  for(int i = 2 ; i <= m ; ++ i)
   {
          while(front < rear && p[i] < p[q[rear-1]])
         rear--;
       q[rear++] = i;
   }
  ans += p[q[front]];
  for(int i = m+1 ; i <= n ; ++ i)
   {
          while(front < rear && i - q[front] >= m)
           front++;
          while(front < rear && p[i] < p[q[rear-1]])
         rear--;
       q[rear++] = i;
       ans += p[q[front]];
   }
  printf("%I64d\n",ans);
  return 0;
}