제출 #1170590

#제출 시각아이디문제언어결과실행 시간메모리
1170590Zero_OPPort Facility (JOI17_port_facility)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, l, r) for(int i = (l); i < (r); ++i)
#define ROF(i, r, l) for(int i = (r)-1; i >= (l); --i)

#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
#define sz(v) (int)v.size()
#define pb push_back
#define eb emplace_back
#define compact(v) v.erase(unique(all(v)), end(v))

#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second

#define dbg(x) "[" #x " = " << (x) << "]"

template<typename T>
      bool minimize(T& a, const T& b){
            if(a > b) return a = b, true;
            return false;
      }

template<typename T>
      bool maximize(T& a, const T& b){
            if(a < b) return a = b, true;
            return false;
      }

using ll = long long;
using db = double;
using ld = long double;
using ull = unsigned long long;

using pi = pair<int, int>;
using pl =pair<ll, ll>;

using vi = vector<int>;
using vl = vector<ll>;
using vb = vector<bool>;
using vc = vector<char>;

using vpi = vector<pi>;
using vpl = vector<pl>;

//mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().cout());
//ll random(ll l, ll r){ return uniform_int_distribution<ll>(l, r)(rng); }

void setIO(){
      ios_base::sync_with_stdio(0); cin.tie(0);
      if(fopen("B.inp", "r")){
            freopen("B.inp", "r", stdin);
            freopen("B.out", "w", stdout);
      }
}

const int MAX = 1e6 + 5;
const int mod = 1e9 + 7;

struct mint{
      int v;
      mint(int v = 0) : v(v) {}

      mint& operator += (const mint& o){
            v += o.v;
            if(v >= mod) v -= mod;
            return *this;
      }

      mint& operator -= (const mint& o){
            v -= o.v;
            if(v < 0) v += mod;
            return *this;
      }

      mint& operator *= (const mint& o){
            v = 1LL * v * o.v % mod;
            return *this;
      }

      friend mint operator + (mint a, const mint& b){ return a += b; }
      friend mint operator - (mint a, const mint& b){ return a -= b; }
      friend mint operator * (mint a, const mint& b){ return a *= b; }

      friend bool operator == (const mint& a, const mint& b){ return a.v == b.v; }
      friend bool operator != (const mint& a, const mint& b){ return a.v != b.v; }

      friend ostream& operator << (ostream& out, const mint& o){ return out << o.v; }
};

int N;
pi segments[MAX];

bool can_put(int i, int j){
      return (segments[i].ff < segments[j].ff && segments[i].ss > segments[j].ss) || (segments[i].ss < segments[j].ff);
}

namespace subtask1{
      bool check(){
            return N <= 20;
      }

      void solve(){
            int cnt = 0;
            for(int mask = 0; mask < (1 << N); ++mask){
                  vi A, B;
                  FOR(i, 0, N){
                        if(mask >> i & 1){
                              A.pb(i+1);
                        } else B.pb(i+1);
                  }

                  bool ok = true;
                  FOR(i, 1, sz(A)){
                        FOR(j, 0, i){
                              ok &= can_put(A[j], A[i]);
                        }
                  }

                  FOR(i, 1, sz(B)){
                        FOR(j, 0, i){
                              ok &= can_put(B[j], B[i]);
                        }
                  }

                  if(ok){
                        ++cnt;
                        cout << bitset<8>(mask) << '\n';
                  }
            }
            cout << cnt << '\n';
      }
}

namespace subtask12{
      bool check(){
            return N <= 2000;
      }

      bool vis[2003];
      vi adj[2003];
      int color[MAX];

      void solve(){
            int cnt = 0;
            FOR(i, 1, N+1){
                  FOR(j, i+1, N+1){
                        if(segments[j].ff < segments[i].ss && segments[i].ss < segments[j].ss) {
                              adj[i].pb(j);
                              adj[j].pb(i);
                              ++cnt;
//                              cout << i << ' ' << j << '\n';
                        }
                  }


            }

            cout << cnt << '\n';
//            assert(cnt <= 2 * N);

            mint ans = 1;
            FOR(i, 1, N+1){
                  if(vis[i]) continue;
                  queue<int> q;
                  q.push(i);
                  vis[i] = true;

//                  cout << dbg(i) << '\n';

                  while(!q.empty()){
                        int u = q.front(); q.pop();
                        for(auto v : adj[u]){
                              if(!vis[v]){
                                    color[v] = color[u] ^ 1;
                                    q.push(v);
                                    vis[v] = true;
                              } else if(color[u] == color[v]){
                                    cout << 0 << '\n';
                                    return;
                              }
                        }
                  }

                  ans += ans;
            }
            cout << ans << '\n';
      }
}


int main(){
      setIO();

      cin >> N;
      FOR(i, 1, N+1){
            cin >> segments[i].ff >> segments[i].ss;
      }

      sort(segments+1, segments + N+1);

//      if(subtask1::check()) return subtask1::solve(), 0;
      if(subtask12::check()) return subtask12::solve(), 0;
//      subtask34::solve();

      return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

port_facility.cpp: In function 'void setIO()':
port_facility.cpp:56:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |             freopen("B.inp", "r", stdin);
      |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
port_facility.cpp:57:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |             freopen("B.out", "w", stdout);
      |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...