結果

問題 No.849 yuki国の分割統治
ユーザー PachicobuePachicobue
提出日時 2019-07-06 22:18:37
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 182 ms / 2,000 ms
コード長 6,451 bytes
コンパイル時間 2,469 ms
コンパイル使用メモリ 211,200 KB
実行使用メモリ 14,336 KB
最終ジャッジ日時 2024-04-16 08:46:53
合計ジャッジ時間 6,158 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 106 ms
7,936 KB
testcase_08 AC 92 ms
7,040 KB
testcase_09 AC 96 ms
6,912 KB
testcase_10 AC 106 ms
7,680 KB
testcase_11 AC 87 ms
6,784 KB
testcase_12 AC 98 ms
7,296 KB
testcase_13 AC 101 ms
7,552 KB
testcase_14 AC 102 ms
7,296 KB
testcase_15 AC 88 ms
6,656 KB
testcase_16 AC 174 ms
12,544 KB
testcase_17 AC 100 ms
7,424 KB
testcase_18 AC 172 ms
12,928 KB
testcase_19 AC 121 ms
8,576 KB
testcase_20 AC 152 ms
11,008 KB
testcase_21 AC 91 ms
7,156 KB
testcase_22 AC 138 ms
10,112 KB
testcase_23 AC 137 ms
10,112 KB
testcase_24 AC 114 ms
8,448 KB
testcase_25 AC 182 ms
14,336 KB
testcase_26 AC 2 ms
5,376 KB
testcase_27 AC 2 ms
5,376 KB
testcase_28 AC 2 ms
5,376 KB
testcase_29 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#pragma GCC diagnostic ignored "-Wsign-compare"
#pragma GCC diagnostic ignored "-Wsign-conversion"
#define NDEBUG
#define SHOW(...) static_cast<void>(0)
//!===========================================================!//
//!  dP     dP                          dP                    !//
//!  88     88                          88                    !//
//!  88aaaaa88a .d8888b. .d8888b. .d888b88 .d8888b. 88d888b.  !//
//!  88     88  88ooood8 88'  '88 88'  '88 88ooood8 88'  '88  !//
//!  88     88  88.  ... 88.  .88 88.  .88 88.  ... 88        !//
//!  dP     dP  '88888P' '88888P8 '88888P8 '88888P' dP        !//
//!===========================================================!//
template <typename T>
T read()
{
    T v;
    return std::cin >> v, v;
}
template <typename T>
std::vector<T> readVec(const std::size_t l)
{
    std::vector<T> v(l);
    for (auto& e : v) { std::cin >> e; }
    return v;
}
using ld = long double;
using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;
constexpr unsigned int MOD = 1000000007;
template <typename T>
constexpr T INF = std::numeric_limits<T>::max() / 4;
template <typename F>
constexpr F PI = static_cast<F>(3.1415926535897932385);
std::mt19937 mt{std::random_device{}()};
template <typename T>
bool chmin(T& a, const T& b) { return (a > b ? a = b, true : false); }
template <typename T>
bool chmax(T& a, const T& b) { return (a < b ? a = b, true : false); }
template <typename T>
std::vector<T> Vec(const std::size_t n, T v) { return std::vector<T>(n, v); }
template <class... Args>
auto Vec(const std::size_t n, Args... args) { return std::vector<decltype(Vec(args...))>(n, Vec(args...)); }
template <typename T>
constexpr T popCount(const T u)
{
#ifdef __has_builtin
    return u == 0 ? T(0) : (T)__builtin_popcountll(u);
#else
    unsigned long long v = static_cast<unsigned long long>(u);
    return v = (v & 0x5555555555555555ULL) + (v >> 1 & 0x5555555555555555ULL), v = (v & 0x3333333333333333ULL) + (v >> 2 & 0x3333333333333333ULL), v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL, static_cast<T>(v * 0x0101010101010101ULL >> 56 & 0x7f);
#endif
}
template <typename T>
constexpr T log2p1(const T u)
{
#ifdef __has_builtin
    return u == 0 ? T(0) : T(64 - __builtin_clzll(u));
#else
    unsigned long long v = static_cast<unsigned long long>(u);
    return v = static_cast<unsigned long long>(v), v |= (v >> 1), v |= (v >> 2), v |= (v >> 4), v |= (v >> 8), v |= (v >> 16), v |= (v >> 32), popCount(v);
#endif
}
template <typename T>
constexpr T clog(const T v) { return v == 0 ? T(0) : log2p1(v - 1); }
template <typename T>
constexpr T msbp1(const T v) { return log2p1(v); }
template <typename T>
constexpr T lsbp1(const T v)
{
#ifdef __has_builtin
    return __builtin_ffsll(v);
#else
    return v == 0 ? T(0) : popCount((v & (-v)) - T(1)) + T(1);
#endif
}
template <typename T>
constexpr bool ispow2(const T v) { return popCount(v) == 1; }
template <typename T>
constexpr T ceil2(const T v) { return v == 0 ? T(1) : T(1) << log2p1(v - 1); }
template <typename T>
constexpr T floor2(const T v) { return v == 0 ? T(0) : T(1) << (log2p1(v) - 1); }
//!====================================================================================!//
//!    .88888.   a88888b. 888888ba        d88b       dP         a88888b. 8888ba.88ba   !//
//!   d8'   '88 d8'   '88 88    '8b       8''8       88        d8'   '88 88  '8b  '8b  !//
//!   88        88        88     88       d8b        88        88        88   88   88  !//
//!   88   YP88 88        88     88     d8P'8b       88        88        88   88   88  !//
//!   Y8.   .88 Y8.   .88 88    .8P     d8' '8bP     88        Y8.   .88 88   88   88  !//
//!    '88888'   Y88888P' 8888888P      '888P''YP    88888888P  Y88888P' dP   dP   dP  !//
//!====================================================================================!//
template <typename T>
constexpr T gcd(const T a, const T b) { return (b != (T)0) ? gcd(b, a % b) : a; }
template <typename T>
constexpr T lcm(const T a, const T b) { return (a == (T)0 and b == (T)0) ? (T)0 : (a / gcd(a, b)) * b; }
//!===============================================================!//
//!   88888888b            dP       .88888.   a88888b. 888888ba   !//
//!   88                   88      d8'   '88 d8'   '88 88    '8b  !//
//!  a88aaaa    dP.  .dP d8888P    88        88        88     88  !//
//!   88         '8bd8'    88      88   YP88 88        88     88  !//
//!   88         .d88b.    88      Y8.   .88 Y8.   .88 88    .8P  !//
//!   88888888P dP'  'dP   dP       '88888'   Y88888P' 8888888P   !//
//!===============================================================!//
template <typename T>
constexpr std::pair<T, T> extgcd(const T a, const T b)
{
    if (b == 0) { return std::pair<T, T>{1, 0}; }
    const auto p = extgcd(b, a % b);
    return {p.second, p.first - p.second * (a / b)};
}
template <typename T>
constexpr T inverse(const T a, const T mod) { return (mod + extgcd((mod + a % mod) % mod, mod).first % mod) % mod; }
//!=====================================!//
//!  8888ba.88ba           oo           !//
//!  88  '8b  '8b                       !//
//!  88   88   88 .d8888b. dP 88d888b.  !//
//!  88   88   88 88'  '88 88 88'  '88  !//
//!  88   88   88 88.  .88 88 88    88  !//
//!  dP   dP   dP '88888P8 dP dP    dP  !//
//!=====================================!//
int main()
{
    ll a = read<ll>(), b = read<ll>(), c = read<ll>(), d = read<ll>();
    const int N = read<int>();
    std::vector<ll> x(N), y(N);
    if (a == 0 and c == 0) {
        std::swap(a, b), std::swap(c, d);
        for (int i = 0; i < N; i++) { std::cin >> y[i] >> x[i]; }
    } else {
        for (int i = 0; i < N; i++) { std::cin >> x[i] >> y[i]; }
    }
    const ll p = gcd(a, c);
    a /= p, c /= p;
    const ll det = std::abs(b * c - d * a);
    const auto coeff = extgcd(a, c);
    using P = std::pair<ll, ll>;
    std::map<ll, std::vector<P>> mp;
    for (int i = 0; i < N; i++) { mp[x[i] % p].push_back({x[i] / p, y[i]}); }
    ll ans = 0;
    for (const auto& pp : mp) {
        std::set<ll> st;
        for (const auto& p : pp.second) {
            const ll x = p.first, y = p.second;
            const ll u = -coeff.first * x, v = -coeff.second * x;
            const ll Y = y + b * u + d * v;
            st.insert(det == 0 ? Y : (det + Y % det) % det);
        }
        ans += st.size();
    }
    std::cout << ans << std::endl;
    return 0;
}
0