Cod sursa(job #1604587)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 18 februarie 2016 13:37:53
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define InFile  "calcule.in"
#define OutFile "calcule.out"
#define MAX 30001
#define MOD 20011

using namespace std;

void read ();
void solve_1 ();
void solve_2 ();
void print ();

unsigned int n;
unsigned short int k;
unsigned short int S[MAX];

unsigned int x[MAX], t[MAX];
//unsigned int matrix[MAX][MAX];
unsigned int Lmax, low, high, mid, cnt, sum;
unsigned int i, j, w;

unsigned int sol1, sol2;

int main ()
{
    read ();
    solve_1 ();
    solve_2 ();
    print ();
    return 0;
}

void read ()
{
    ifstream fin (InFile);
    fin >> n >> k;
    for (i=0; i<n; i++)
        fin >> S[i];
}

void solve_1 ()
{
    // sub.cres.max.
    x[1] = 1;
    cnt = 1;
    for (i=2; i<=n; i++)
    {
        low = 1;
        high = cnt;
        while (low <= high)
        {
            mid = (low+high) / 2;
            if (S[i] > S[x[mid]])
                low = mid + 1;
            else
                high = mid - 1;
        }
        if (low > cnt)
            cnt++;
        x[low] = i;
        t[i] = x[low-1];
    }
    sol1 = cnt;
}

void solve_2 ()
{
    sum = 0;
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
        {
            for (w=i; w<j; w++)
                sum += S[w];
            if (sum%k == 0)
                sol2++;
        }
    sol2 %= MOD;
}

void print ()
{
    ofstream fout (OutFile);
    fout << sol1 << '\n';
    fout << sol2;
}