Submission #1201603

#TimeUsernameProblemLanguageResultExecution timeMemory
1201603ThanhsFinding Routers (IOI20_routers)C++20
Compilation error
0 ms0 KiB
#include <vector>
#include <cassert>
#include <cstdio>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;

static int l, n, q;
static std::vector<int> p;
static std::vector<int> answer;
static int queries = 0;

int use_detector(int x)
{
	queries++;
    assert(x >= 0 && x <= l);
    std::vector<int>::iterator left, right;
    right = std::upper_bound(p.begin(), p.end(), x);
    left = std::prev(right);

    if (right == p.end()) {
        return n - 1;
    } else if ((x - *left) <= (*right - x)){
        return std::distance(p.begin(), left);
    } else {
        return std::distance(p.begin(), right);
    }
}

const int NM = 1e5 + 5;

vector<int> res, ans;
int GET[NM];
set<int> s;

int get(int x)
{
    if (GET[x] != -1)
        return GET[x];
    s.insert(x);
    return GET[x] = use_detector(x);
}

int cnt = 0;

void calc(int L, int R, int x)
{
    if (!cnt)
        return;
    while (s.size() && ans[get(*s.begin())] != -1)
        s.erase(s.begin());
    int l = L + 1, r = (s.empty() ? R : *s.begin());
    while (l < r - 1)
    {
        int m = l + r >> 1;
        (get(m) == x ? l : r) = m;
    }
    int nx = L + 2 * (r - L - (get(r) > x));
    ans[get(r)] = nx;
    cnt--;
    calc(nx, R, get(r));
}

vector<int> find_routers(int l, int n, int q)
{
    ans.resize(n, -1);
    ans[0] = 0;
    memset(GET, -1, sizeof GET);
    cnt = n - 1;
    calc(0, l, 0);
    return ans;
}

int main()
{
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    assert(scanf("%d %d %d", &l, &n, &q) == 3);
    p.resize(n);
    for (int i = 0; i < n; i++) {
        assert(scanf("%d", &p[i]) == 1);
        if (i) {
            assert(p[i-1] < p[i]);
        }
    }

    fclose(stdin);

    answer = find_routers(l, n, q);

    assert((int) answer.size() == n);
    for (int i = 0; i < n; i++)
    {
        assert(answer[i] >= 0 && answer[i] <= l && answer[i] % 2 == 0);
    }

    for (int i = 0; i < n; i++)
    {
        if (i) printf(" ");
        printf("%d", answer[i]);
    }
    printf("\n");

    printf("%d\n", queries);
}

Compilation message (stderr)

routers.cpp: In function 'int main()':
routers.cpp:76:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     freopen("in.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
routers.cpp:77:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     freopen("out.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld: /tmp/ccb0LAlr.o: in function `use_detector(int)':
grader.cpp:(.text+0x0): multiple definition of `use_detector(int)'; /tmp/ccOt01Zs.o:routers.cpp:(.text+0x0): first defined here
/usr/bin/ld: /tmp/ccb0LAlr.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccOt01Zs.o:routers.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status