답안 #296358

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
296358 2020-09-10T13:52:51 Z Mlxa Monochrome Points (JOI20_monochrome) C++14
0 / 100
7 ms 2176 KB
#ifdef LC
#include "pch.h"
#else
#include <bits/stdc++.h>
#endif
using namespace std;
#define all(x) x.begin(), x.end()
#define x first
#define y second

const int INPUT_BUF = 1 << 12;
const int OUTPUT_BUF = 1 << 16;
char input[INPUT_BUF];
char output[OUTPUT_BUF];
int input_ptr = 0;
int input_len = 0;
int output_ptr = 0;

inline
bool check_eof() {
    if (input_ptr == input_len) {
        input_ptr = 0;
        input_len = fread(input, 1, INPUT_BUF, stdin);
    }
    return input_ptr == input_len;
}
inline
char get_char() {
    assert(!check_eof());
    return input[input_ptr++];
}
inline
char read_char() {
    char c = get_char();
    while (c <= ' ') {
        c = get_char();
    }
    return c;
}
inline
int read_int() {
    int sgn = +1;
    char c = read_char();
    if (c == '-') {
        sgn = -1;
        c = get_char();
    }
    int x = 0;
    while ('0' <= c && c <= '9') {
        x = 10 * x + c - '0';
        c = get_char();
    }
    return x * sgn;

}
inline
__attribute__((destructor))
void flush_output() {
    fwrite(output, 1, output_ptr, stdout);
    output_ptr = 0;
}
inline
void write(char c) {
    if (output_ptr == OUTPUT_BUF) {
        flush_output();
    }
    output[output_ptr++] = c;
}
inline
void write(signed x) {
    static const int LEN = 20;
    static char tmp[LEN];
    int n = 0;
    if (x < 0) {
        write('-');
        x *= -1;
    }
    while (!n || x) {
        tmp[n++] = (char)(x % 10 + '0');
        x /= 10;
    }
    while (n--) {
        write(tmp[n]);
    }
}
inline
void write(long long x) {
    static const int LEN = 20;
    static char tmp[LEN];
    int n = 0;
    if (x < 0) {
        write('-');
        x *= -1;
    }
    while (!n || x) {
        tmp[n++] = (char)(x % 10 + '0');
        x /= 10;
    }
    while (n--) {
        write(tmp[n]);
    }
}
inline
void write(string s) {
    for (char c : s) {
        write(c);
    }
}
inline
void write(const char *s) {
    for (const char *ptr = s; *ptr; ++ptr) {
        write(*ptr);
    }
}

const int N = 2e5 + 10;
int n;
char s[N];
vector<int> g[2];
int fen[N];
void clear() {
    fill_n(fen, N, 0);
}
void add(int i) {
    for (; i < N; i |= i + 1) {
        ++fen[i];
    }
}
int sum(int i) {
    int s = 0;
    for (; i >= 0; i = (i & (i + 1)) - 1) {
        s += fen[i];
    }
    return s;
}
int go[N];
int func(int k) {
    int s = 0;
    for (int i = 0; i < (int)g[0].size(); ++i) {
        int j = (i + k) % (int)g[1].size();
        go[g[0][i]] = g[1][j];
        go[g[1][j]] = g[0][i];
    }
    clear();
    for (int i = n - 1; i >= 0; --i) {
        if (go[i] <= i) {
            s += sum(i) - sum(go[i]);
            add(go[i]);
        }
    }
    clear();
    for (int i = 0; i < n; ++i) {
        if (i <= go[i]) {
            s += sum(go[i]) - sum(i);
            add(go[i]);
        }
    }
    return -(s / 2);
}
int der(int k) {
    return func((k + 1) % n) - func(k);
}

int32_t main() {
#ifdef LC
    assert(freopen("input.txt", "r", stdin));
    //assert(freopen("output.txt", "w", stdout));
#endif
    ios::sync_with_stdio(0); cin.tie(0);
    
    n = read_int();
    n *= 2;
    for (int i = 0; i < n; ++i) {
        if ((s[i] = read_char()) == 'W') {
            g[0].push_back(i);
        } else {
            g[1].push_back(i);
        }
    }
    for (int i = 0; i < n / 2; ++i) {
        cerr << func(i) << " ";
    }
    cerr << endl;
    
    int ans;
    if (n <= 4) {
        ans = 0;
        for (int i = 0; i < n / 2; ++i) {
            ans = min(ans, func(i));
        }
    } else if (der(0) < 0) {
        int lef = 0, rig = n / 2 - 1;
        int bound = max(func(lef), func(rig));
        while (rig - lef > 1) {
            int mid = (lef + rig) / 2;
            if (der(mid) < 0 && func(mid) <= bound) {
                lef = mid;
            } else {
                rig = mid;
            }
        }
        assert(der(lef) <= 0 && func(lef) <= func(0));
        assert(der(rig) >= 0 && func(rig) <= func(0));
        ans = func(rig);
    } else {
        int lef = 0, rig = n / 2 - 1;
        int bound = min(func(lef), func(rig));
        while (rig - lef > 1) {
            int mid = (lef + rig) / 2;
            if (der(mid) < 0 || func(mid) >= bound) {
                lef = mid; 
            } else {
                rig = mid;
            }
        }
        assert(der(lef) <= 0);
        assert(der(rig) >= 0);
        ans = func(rig);
    }
    ans *= -1;
    write(ans);
    write('\n');
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1152 KB Output is correct
2 Correct 2 ms 1152 KB Output is correct
3 Correct 5 ms 1152 KB Output is correct
4 Correct 6 ms 1152 KB Output is correct
5 Correct 5 ms 1152 KB Output is correct
6 Correct 5 ms 1152 KB Output is correct
7 Correct 6 ms 1152 KB Output is correct
8 Correct 6 ms 1152 KB Output is correct
9 Correct 6 ms 1152 KB Output is correct
10 Correct 6 ms 1152 KB Output is correct
11 Runtime error 7 ms 2176 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1152 KB Output is correct
2 Correct 2 ms 1152 KB Output is correct
3 Correct 5 ms 1152 KB Output is correct
4 Correct 6 ms 1152 KB Output is correct
5 Correct 5 ms 1152 KB Output is correct
6 Correct 5 ms 1152 KB Output is correct
7 Correct 6 ms 1152 KB Output is correct
8 Correct 6 ms 1152 KB Output is correct
9 Correct 6 ms 1152 KB Output is correct
10 Correct 6 ms 1152 KB Output is correct
11 Runtime error 7 ms 2176 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1152 KB Output is correct
2 Correct 2 ms 1152 KB Output is correct
3 Correct 5 ms 1152 KB Output is correct
4 Correct 6 ms 1152 KB Output is correct
5 Correct 5 ms 1152 KB Output is correct
6 Correct 5 ms 1152 KB Output is correct
7 Correct 6 ms 1152 KB Output is correct
8 Correct 6 ms 1152 KB Output is correct
9 Correct 6 ms 1152 KB Output is correct
10 Correct 6 ms 1152 KB Output is correct
11 Runtime error 7 ms 2176 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1152 KB Output is correct
2 Correct 2 ms 1152 KB Output is correct
3 Correct 5 ms 1152 KB Output is correct
4 Correct 6 ms 1152 KB Output is correct
5 Correct 5 ms 1152 KB Output is correct
6 Correct 5 ms 1152 KB Output is correct
7 Correct 6 ms 1152 KB Output is correct
8 Correct 6 ms 1152 KB Output is correct
9 Correct 6 ms 1152 KB Output is correct
10 Correct 6 ms 1152 KB Output is correct
11 Runtime error 7 ms 2176 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -