提出 #45082701


ソースコード 拡げる

#include <bits/stdc++.h>
#include <atcoder/all>
#include <boost/multiprecision/cpp_int.hpp>

using namespace std;
using boost::multiprecision::cpp_int;

// clang-format off
/* accelration */
// 高速バイナリ生成
//#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
// cin cout の結びつけ解除, stdioと同期しない(入出力非同期化)
// cとstdの入出力を混在させるとバグるので注意
struct Fast {Fast() {std::cin.tie(0); ios::sync_with_stdio(false);}} fast;

/* alias */
// type
using ull = unsigned long long;
using ll = long long;
using ld = long double;
// pair
using pii = pair<int, int>;
// vector
using vi = vector<int>;
using vl = vector<long>;
using vll = vector<ll>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using vvll = vector<vll>;
using vs = vector<string>;
using vpii = vector<pii>;
// unordered set
using usi = unordered_set<int>;
using usll = unordered_set<ll>;
using uss = unordered_set<string>;

/* define short */
#define pb push_back
#define mp make_pair
#define um unordered_map
#define all(obj) (obj).begin(), (obj).end()
#define YESNO(bool) if(bool){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}
#define yesno(bool) if(bool){cout<<"yes"<<endl;}else{cout<<"no"<<endl;}
#define YesNo(bool) if(bool){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}

/* REP macro */
#define reps(i, a, n) for (ll i = (a); i < (ll)(n); ++i)
#define rep(i, n) reps(i, 0, n)
#define rep1(i, n) reps(i, 1, n + 1)
#define repr(i,n) for(ll i=n-1;i>=0;i--)
#define rep1r(i,n) for(ll i=n;i>=1;i--)
#define fore(i,a) for(auto &i:a)

/* func */
inline int in_int() {int x; cin >> x; return x;}
inline ll in_ll() {ll x; cin >> x; return x;}
inline double in_double() {{double x; cin >> x; return x;}}
inline string in_str() {string x; cin >> x; return x;}
inline vll in_vll(int n) { vll x(n); rep(i,n) cin >> x[i]; return x;}
inline int ctoi(char c) {return c - '0';}
inline ll sum(vll a) { return accumulate(all(a),0LL);}

// vector_finder: (arg)elementを vectorの先頭から(arg)search_lengthまで先頭から検索し、boolを返す
// (arg)search_length: 走査するベクトル長の上限(先頭から何要素目までを検索対象とするか、1始まりで)
template <typename T> inline bool vector_finder(std::vector<T> vec, T element, unsigned int search_length) {
    auto itr = std::find(vec.begin(), vec.end(), element);
    size_t index = std::distance( vec.begin(), itr );
    if (index == vec.size() || index >= search_length) {return false;} else {return true;}
}
template <typename T> inline void print(const vector<T>& v, string s = " ")
{rep(i, v.size()) cout << v[i] << (i != (ll)v.size() - 1 ? s : "\n");}
template <typename T, typename S> inline void print(const pair<T, S>& p)
{cout << p.first << " " << p.second << endl;}
template <typename T> inline void print(const T& x) {cout << x << "\n";}
template <typename T, typename S> inline void print(const vector<pair<T, S>>& v)
{for (auto&& p : v) print(p);}
template <typename T, typename S> inline void print(const map<T, S>& m)
{for (auto&& p : m) print(p);}
// 第一引数と第二引数を比較し、第一引数(a)をより大きい/小さい値に上書き
template <typename T> inline bool chmin(T& a, const T& b) {bool compare = a > b; if (a > b) a = b; return compare;}
template <typename T> inline bool chmax(T& a, const T& b) {bool compare = a < b; if (a < b) a = b; return compare;}
// gcd lcm
// C++17からは標準実装
// template <typename T> T gcd(T a, T b) {if (b == 0)return a; else return gcd(b, a % b);}
// template <typename T> inline T lcm(T a, T b) {return (a * b) / gcd(a, b);}
// clang-format on

template <typename T> inline map<T,ull> counter(const vector<T>& x) {
    map<T,ull> m;
    fore(xi,x) {
        if(m.find(xi)==m.end()){
            m.insert(make_pair(xi,1));
        }
        else{
            m[xi]+=1;
        }
    }
    return m;
}
inline map<char,ull> counter(const string& x) {
    map<char,ull> m;
    fore(xi,x) {
        if(m.find(xi)==m.end()){
            m.insert(make_pair(xi,1));
        }
        else{
            m[xi]+=1;
        }
    }
    return m;
}

// Sieve of Eratosthenes
// https://youtu.be/UTVg7wzMWQc?t=2774
struct Sieve {
    int n;
    vector<int> f, primes;
    Sieve(int n=1):n(n), f(n+1) {
        f[0] = f[1] = -1;
        for (ll i = 2; i <= n; ++i) {
            if (f[i]) continue;
            primes.push_back(i);
            f[i] = i;
            for (ll j = i*i; j <= n; j += i) {
                if (!f[j]) f[j] = i;
            }
        }
    }
    bool isPrime(int x) { return f[x] == x;}
    ll minfactor(ll x) { return f[x];}
    vector<int> factorList(int x) {
        vector<int> res;
        while (x != 1) {
            res.push_back(f[x]);
            x /= f[x];
        }
        return res;
    }
    vector<pii> factor(int x) {
        vector<int> fl = factorList(x);
        if (fl.size() == 0) return {};
        vector<pii> res(1, pii(fl[0], 0));
        for (int p : fl) {
            if (res.back().first == p) {
                res.back().second++;
            } else {
                res.emplace_back(p, 1);
            }
        }
        return res;
    }
    vector<pair<ll,int>> factor(ll x) {
        vector<pair<ll,int>> res;
        for (int p : primes) {
            int y = 0;
            while (x%p == 0) x /= p, ++y;
            if (y != 0) res.emplace_back(p,y);
        }
        if (x != 1) res.emplace_back(x,1);
        return res;
    }
};

inline vector<char> str2charvec(string s) { vector<char> r(s.begin(),s.end()); return r;}

template <typename T> inline vector<pair<T,ll>> runlength(vector<T> x) {
    vector<pair<T,ll>> r;
    ll cnt = 1;
    ll n = x.size();
    rep(i,n-1){
        if(x[i]==x[i+1]){cnt++;}
        else{ r.push_back(make_pair(x[i],cnt));cnt=1;}
        if(i==n-2){
            r.push_back(make_pair(x[n-1],cnt));
        }
    }
    return r;
}

struct ModComb{
    vll fac;
    vll finv;
    ll n = 0;
    ll p = 0;

    ModComb(ll n, ll p): n(n), p(p) {
        fac.resize(n+1);
        finv.resize(n+1);
        vll inv(n+1);

        fac[0] = 1;
        fac[1] = 1;
        finv[0] = 1;
        finv[1] = 1;
        inv[1] = 1;

        for (int i = 2; i < n+1; i++)
        {
            fac[i] = (fac[i-1] * i ) % p;
            inv[i] = (p - ( (p/i) * inv[p%i]) %p ) %p;
            finv[i] = (finv[i-1] * inv[i]) %p;
        }
    }

    ll C(ll n, ll k) {
        if (k<0 || n<k) return 0;
        return ((fac[n] * finv[n-k]) % p * finv[k]) % p;
    }

    ll P(ll n, ll k){
        if (k<0 || n<k) return 0;
        return (fac[n] * finv[k]) % p;
    }

    //n個をk箇所に振り分ける(0もあり)
    ll H(ll n, ll k) {
        if(n==0 && k==0) return 1;
        if (k <= 0 || n < 0) return 0;
        return C(n+k-1, n);
    }
};

template<typename T>
struct Acc{
    vector<T> acc;
    Acc(string v){
        acc.resize(v.size()+1);
        acc[0] = 0;
        rep(i,v.size()) acc[i+1] = acc[i] + ctoi(v[i]);
    }
    Acc(vector<T> v){
        acc.resize(v.size()+1);
        acc[0] = 0;
        rep(i,v.size()) acc[i+1] = acc[i] + v[i];
    }
    ll size(){
        return acc.size();
    }
    T operator[] (ll i){
        return acc[i];
    }
};

#ifdef LOCAL
#include <debug_print/debug_print.hpp>
#  define debug(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__)
#  define dbg(...) cerr << "\033[33m(line:" << __LINE__ << ") "; debug(__VA_ARGS__);
#else
#  define dbg(...) (static_cast<void>(0))
#endif

int main() {
    ll n = in_ll();
    ll m = in_ll();

    vector<unordered_set<ll>> g(n);
    rep(_,m){
        ll u,v;
        cin >> u >> v;
        g[u-1].insert(v-1);
        g[v-1].insert(u-1);
    }

    vll done(n,-1);
    vpii todo;
    vpii gr;

    rep(i,n){
        if(done[i]!=-1) continue;
        todo.pb({i,0});
        ll b = 0;
        ll w = 0;
        while (!todo.empty())
        {
            auto [cur, cur_col] = todo.back();
            todo.pop_back();
            if(done[cur] != -1) {
                if(done[cur]== cur_col) continue;
                else{ print(0); return 0;}
            }
            done[cur] = cur_col;
            cur_col ? w++ : b++;
            fore(ad, g[cur]){
                if(done[ad] != -1) {
                    if(done[ad]==cur_col){
                        print(0); return 0;
                    } else{
                        continue;
                    }
                }
                todo.pb({ad,cur_col^1});
            }
        }
        gr.pb({b,w});
    }

    ll ans = n*(n-1)/2;
    rep(i,gr.size()){
        ll w = gr[i].first;
        ll b = gr[i].second;
        ans -= (w*(w-1)/2+b*(b-1)/2);
    }
    print(ans-m);
}

提出情報

提出日時
問題 D - Make Bipartite 2
ユーザ KOKI1634
言語 C++ (GCC 9.2.1)
得点 400
コード長 8742 Byte
結果 AC
実行時間 264 ms
メモリ 39396 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 3
AC × 47
セット名 テストケース
Sample example0.txt, example1.txt, example2.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, example0.txt, example1.txt, example2.txt
ケース名 結果 実行時間 メモリ
000.txt AC 6 ms 3600 KiB
001.txt AC 3 ms 3644 KiB
002.txt AC 29 ms 17840 KiB
003.txt AC 16 ms 16360 KiB
004.txt AC 183 ms 39396 KiB
005.txt AC 239 ms 34652 KiB
006.txt AC 242 ms 34656 KiB
007.txt AC 248 ms 34628 KiB
008.txt AC 148 ms 20224 KiB
009.txt AC 212 ms 23688 KiB
010.txt AC 220 ms 23636 KiB
011.txt AC 53 ms 11812 KiB
012.txt AC 74 ms 20832 KiB
013.txt AC 128 ms 17864 KiB
014.txt AC 186 ms 32676 KiB
015.txt AC 41 ms 19528 KiB
016.txt AC 25 ms 17772 KiB
017.txt AC 22 ms 17996 KiB
018.txt AC 22 ms 17776 KiB
019.txt AC 208 ms 30928 KiB
020.txt AC 39 ms 8848 KiB
021.txt AC 187 ms 20804 KiB
022.txt AC 48 ms 9940 KiB
023.txt AC 42 ms 10000 KiB
024.txt AC 85 ms 24172 KiB
025.txt AC 46 ms 20280 KiB
026.txt AC 21 ms 17772 KiB
027.txt AC 20 ms 17860 KiB
028.txt AC 20 ms 17848 KiB
029.txt AC 241 ms 24304 KiB
030.txt AC 224 ms 23428 KiB
031.txt AC 216 ms 22832 KiB
032.txt AC 245 ms 23280 KiB
033.txt AC 14 ms 4648 KiB
034.txt AC 165 ms 29116 KiB
035.txt AC 26 ms 18024 KiB
036.txt AC 37 ms 19256 KiB
037.txt AC 23 ms 18048 KiB
038.txt AC 23 ms 17748 KiB
039.txt AC 264 ms 33756 KiB
040.txt AC 247 ms 25760 KiB
041.txt AC 207 ms 21624 KiB
042.txt AC 213 ms 22832 KiB
043.txt AC 10 ms 4040 KiB
example0.txt AC 3 ms 3604 KiB
example1.txt AC 2 ms 3672 KiB
example2.txt AC 3 ms 3508 KiB