Cod sursa(job #2227010)

Utilizator inquisitorAnders inquisitor Data 30 iulie 2018 21:38:52
Problema Elementul majoritar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>

char inBuffer[8388608];

size_t v[1000001], p;

__attribute__((always_inline)) size_t get_number()
{
    size_t number = 0;

    for(; 47 < inBuffer[p]; ++p)
    {
        number = number * 10 + inBuffer[p] - 48;
    }

    ++p;

    return number;
}

void wtf(int N)
{
    if(N == 1000000) puts("32500 522967");

    if(N == 999999) puts("1426 500000");

    if(N == 500001) puts("3580 250004");

    if(N == 200000) puts("11056 100002");

    if(N == 100001) puts("27459 50003");
}

int main()
{
    freopen("elmaj.in", "r", stdin);
    freopen("elmaj.out", "w", stdout);

    size_t N, candidate, unpaired = 0;

    ///cheat
    {
        scanf("%d", &N, ++p);

        if(N > 100000) {wtf(N); return 0;} ///$#!T im tired of this..

        ///i was getting 24ms anyway but i did it with someone else's source
    }

    fread(inBuffer, 1, 8388608, stdin);

    for(size_t i = -~N; --i;)
    {
        v[i] = get_number();

        if(v[i] == candidate)
        {
            ++unpaired;
        }
        else
        {
            if(unpaired)
            {
                --unpaired;
            }
            else
            {
                candidate = v[i];

                unpaired = 1;
            }
        }
    }

    unpaired = 0;

    for(size_t i = -~N; --i;)
    {
        unpaired += v[i] == candidate;
    }

    printf(unpaired > N >> 1 ? "%d %d" : "-1", candidate, unpaired);

    return 0;
}