Cod sursa(job #954983)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 30 mai 2013 16:17:13
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <deque>
using namespace std;

ifstream fin("trans.in");
ofstream fout("trans.out");


bool c;
int s,S[16001][2],bst[16001][2];  // S[i][c] = suma ce trebuie platita pentru a converti pietrele de la 1 la i in culorea c; putem obtine astfel suma de convertire in culoarea c a oricarei succesiuni de pietre: suma[i..j][c]= S[j][c] - S[i][c];
int v[16001][2],Q,n,i,k,t;        // bst[i][c]= suma minima ce trebuia platita pentru a transporta primele i pietre cand ultimul camion are culoarea c
// Formula de recurenta este bst[i][c] = Min { min( bst[j][0], bst[j][1]) + S[i][c] - S[i][j] +T } pentru i-k <= j <i. (adica o optiune este sa transportam pietrele j..i in acelasi camion cu culoarea c adaugandu-se la costul cel mai bun de a transporta pietrele 1..j. Dintre toate tipurile acestea de optiuni o alegem pe cea mai buna pentru fiecare culoare c
// v[i][c] = elementele ce constituie deque-ul acestei probleme; este termenul min (bst[j][0],bst[j][1]) - S[i][j] din relatia de mai sus, deoarece S[i][c] si T sunt termeni fixci (nu depind de j). Profitam astfel de abilitatea deque-ului de a ne da minimul la fiecare pas pt un interval ce se muta cu cate o unitate.

int minm (int a, int b)
{
    if(a<b) return a;
    return b;
}

void insert_in_deque (deque <int> &D, int c,int i)
{
    v[i][c]=minm (bst[i][0],bst[i][1]) - S[i][c];
    while ( !D.empty () && v[i][c] <= v[D.back()][c]) D.pop_back ();
    D.push_back (i);
}

void eject_from_deque (deque <int> &D,const int i)
{
    if (D.front ()==i) D.pop_front ();
}

int dynamic (const int k,const int t)
{
    deque <int> D[2];

    for (int i=1; i<=n; i++)
    {
        insert_in_deque (D[0],0,i-1);
        insert_in_deque (D[1],1,i-1);
        eject_from_deque (D[0],i-k-1);
        eject_from_deque (D[1],i-k-1);

        bst[i][0] = v[D[0].front ()][0] + S[i][0] + t;
        bst[i][1] = v[D[1].front ()][1] + S[i][1] + t;
    }
    return minm (bst[n][0],bst[n][1]);
}

int main ()
{
    fin>>n;
    for (i=1;i<=n;i++)
    {
        fin>>c>>s;
        S[i][c]=S[i-1][c]+s;
        S[i][1-c]=S[i-1][1-c];
    }
    fin>>Q;
    for (i=1;i<=Q;i++)
    {
        fin>>k>>t;
        fout<<dynamic (k,t)<<"\n";
    }
}