Cod sursa(job #1552690)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 18 decembrie 2015 14:43:19
Problema Divk Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#include<vector>
using namespace std;
int n, k, a, b, p, u, mid, x, i, j, sum;
long long sol;
vector< int > v[100005];
ifstream fin("divk.in");
ofstream fout("divk.out");
int main(){
    fin>> n >> k >> a >> b;
    for(i = 1; i <= n; i++){
        fin>> x;
        sum = (sum + x) % k;
        v[sum].push_back(i);
    }
    for(i = 0; i < v[0].size(); i++){
        if(v[0][i] >= a && v[0][i] <= b){
            sol++;
        }
    }
    for(j = 0; j < k; j++){
        for(i = 0; i < v[j].size(); i++){
            p = i + 1;
            u = v[j].size() - 1;
            while(p <= u){
                mid = (p + u) / 2;
                if(v[j][mid] - v[j][i] >= a){
                    u = mid - 1;
                }
                else{
                    p = mid + 1;
                }
            }
            x = p;

            p = i + 1;
            u = v[j].size() - 1;
            while(p <= u){
                mid = (p + u) / 2;
                if(v[j][mid] - v[j][i] <= b){
                    p = mid + 1;
                }
                else{
                    u = mid - 1;
                }
            }

            sol += u - x + 1;
        }
    }
    fout<< sol <<"\n";
    return 0;
}