Cod sursa(job #1559868)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 31 decembrie 2015 17:56:17
Problema Divk Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<vector>
#include<iostream>

using namespace std;

ifstream f("divk.in");
ofstream g("divk.out");

vector <int> G[100005];
int V[100005], Sol[100005];
long long S[100005];
int n, k, a, b, sub_sec;

void citire()
{
    int i;
    f>>n>>k>>a>>b;
    for(i=1; i<=n; i++){
        f>>V[i];
    }
}

int cautare_jos(int nod, int pos)
{
    int st, dr, mid, sol = 0, val;
    val = pos - b;
    if(val < 0)
        return 0;
    st = 0;
    dr = G[nod].size() - 2;
    while(st <= dr){
        mid = (st + dr)/2;
        if(G[nod][mid] >= val){
            dr = mid - 1;
            sol = mid;
        }
        else
            st = mid + 1;
    }
    if(G[nod][sol] > pos - a)
        sol = 0;
    return sol;
}

int cautare_sus(int nod, int pos)
{
    int st, dr, mid, sol = -1, val;
    val = pos - a;
    st = 0;
    dr = G[nod].size() - 2;
    while(st <= dr){
        mid = (st + dr)/2;
        if(G[nod][mid] <= val){
            st = mid + 1;
            sol = mid;
        }
        else
            dr = mid - 1;
    }
    if(G[nod][sol] < pos - b)
        sol = -1;
    return sol;
}

void semi_dinam()
{
    int i, place, diff;

    G[0].push_back(0);

    for(i=1; i<=n; i++){
        diff = 0;
        S[i] = S[i-1] + V[i];
        place = S[i] % k;
        G[place].push_back(i);
        if(i-a >= 0)
            diff = cautare_sus(place, i) - cautare_jos(place, i) + 1;
        cout<<diff<<" ";
        Sol[i] = diff;
        sub_sec += diff;
    }
    g<<sub_sec<<"\n";
}

int main()
{
    citire();
    semi_dinam();
    return 0;
}