Cod sursa(job #1657667)

Utilizator danutbodbodnariuc danut danutbod Data 20 martie 2016 17:46:52
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.5 kb
//var I 100p
#include <fstream>
#define NMax 5000003
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int a[NMax], deque[NMax],i,k,n,p,u;
long long s;
int main()
{
    f>>n>>k;
    for(i=1; i<=n; i++) f>>a[i];
    p=1;u=0;
    for(i=1; i<=n; i++)
    {
        while(p<=u && a[i]<= a[deque[u]]) u--;
        deque[++u]=i;
        if(deque[p]==i-k) p++;
        if(i>=k) s+=a[deque[p]];
    }
    g<<s<<'\n';
    return 0;
}
////var II 100p
//#include <fstream>
//#define  NMax 10000003
//using namespace std;
//ifstream f("deque.in");
//ofstream g("deque.out");
//int deque[NMax],a[NMax],i,n,x,k,p,u;
//long long s;
//int main()
//{
//    f>>n>>k;
//    for(i=1;i<=n;i++)f>>a[i];
//    p=1;u=0;
//    for(i=1;i<=n;i++){
//
//       while(p<=u&&deque[u]>a[i])u--;
//       u++;deque[u]=a[i];
//       if(i>=k){
//                s+=(long long)deque[p];
//                if(deque[p]==a[i-k+1])p++;
//         }
//    }
//    g<<s<<'\n';
//    g.close();
//    return 0;
//}
////var III 100p
//#include <fstream>
//#define  NMax 10000003
//using namespace std;
//ifstream f("deque.in");
//ofstream g("deque.out");
//int deque[NMax],a[NMax],i,n,x,k,p,u;
//long long s;
//int main()
//{
//    f>>n>>k;
//    for(i=1;i<=n;i++)f>>a[i];
//    p=1;u=1;deque[u]=a[1];
//    for(i=2;i<=k;i++){
//       while(p<=u&&deque[u]>a[i])u--;
//       u++;deque[u]=a[i];
//    }
//    s+=(long long)deque[p];
//    for(i=k+1;i<=n;i++){
//       if(deque[p]==a[i-k])p++;
//       while(p<=u&&deque[u]>a[i])u--;
//       u++;deque[u]=a[i];
//       s+=(long long)deque[p];
//    }
//    g<<s<<'\n';
//    g.close();
//    return 0;
//}
/*
#include <fstream>//deque cu struct
#include <deque>
using namespace std;
ifstream fi("deque.in");
ofstream fo("deque.out");
struct nod{
     int val;
     int poz;
}y;
deque < nod > dq;
int n,i,j,k,s,x;
long long mini;
 
int main()
{
   fi>>n>>k;
   for(i=1;i<=n;i++){
      fi>>x;
      while(!dq.empty() and dq.back().val>x)
           dq.pop_back();
      y.val=x;
      y.poz=i;
      dq.push_back(y);
      if(dq.front().poz<i-k+1)
         dq.pop_front();
      if(i>=k)   mini+=dq.front().val;
   }
  fo<<mini;
  return 0;
}
*/
//#include <fstream>  //deque cu pair
//#include <queue>
//using namespace std;
//ifstream fi("deque.in");
//ofstream fo("deque.out");
//int n, k, x;
//deque <pair <int, int> > deq;
//long long smini;
//int main()
//{
//    fi>> n >> k;
//    for (int i = 1; i <= n; i++) {
//        fi >> x;
//        while (!deq.empty() && deq.front().first <= i - k)
//            deq.pop_front();
//        while (!deq.empty() && deq.back().second >= x)
//            deq.pop_back();
//        deq.push_back(make_pair(i,x));
//        if (i >= k)
//            smini += deq.front().second;
//    }
//
//   fo<<smini;
//   return 0;
//}
////rez. cu multiset(arbori de sortare) ceva greseste !?
////raspuns gresit si depasire de timp
//ar trebui sa dea 60p!!
//#include <fstream>
//#include <set>
//using namespace std;
//ifstream fi("deque.in");
//ofstream fo("deque.out");
//multiset < int > ms;
//multiset<int>::iterator it;
//int n,i,j,k,s,x,y,a[5000001];
//long long mini;
//
//int main()
//{
//   fi>>n>>k;
//   for(i=1;i<=n;i++)fi>>a[i];
//   for(i=1;i<=n;i++){
//      ms.insert(a[i]);
//      if(i>=k) {
//                it=ms.begin();
//                mini+=*it;
//                ms.erase(a[i-k+1]);
//       }
//   }
//  fo<<mini;
//  return 0;
//}