답안 #119657

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
119657 2019-06-21T15:40:57 Z Milki Alternating Current (BOI18_alternating) C++14
19 / 100
134 ms 8208 KB
#include<bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define REP(i, n) FOR(i, 0, n)
#define _ << " " <<
#define sz(x) ((int) x.size())
#define pb(x) push_back(x)
#define TRACE(x) cerr << #x << " = " << x << endl

typedef long long ll;
typedef pair<int, int> point;

const int MAXN = 1e5 + 5, off = 1 << 17;

struct event{
  int x, y, id;
  event(){}
  event(int x, int y, int id) : x(x), y(y), id(id) {}

  friend bool operator < (const event &A, const event &B){
    if(A.x != B.x) return A.x < B.x;
    return A.y > B.y;
  }
};

int n, m, par[MAXN];
event rail[MAXN];
vector <event> v, ev;
bool sol[MAXN];

struct Tournament{
  int t[2 * off], p[2 * off];

  Tournament(){}
  void reset(){
    memset(t, 0, sizeof(t));
    memset(p, 0, sizeof(p));
  }
  void prop(int x){
    if(!t[x])
      t[x] = p[x];
    if(x < off){
      p[x * 2] = max(p[x], p[x * 2]);
      p[x * 2 + 1] = max(p[x], p[x * 2 + 1]);
    }
    p[x] = 0;
  }
  void update(int x, int lo, int hi, int a, int b){
    prop(x);
    if(lo >= b || hi <= a) return;
    if(lo >= a && hi <= b) { p[x] = 1; prop(x); return; }
    int mid = (lo + hi) >> 1;
    update(x * 2, lo, mid, a, b); update(x * 2 + 1, mid, hi, a, b);
  }
  int get(int x, int lo, int hi, int a, int b){
    prop(x);
    if(lo >= b || hi <= a) return 0;
    if(lo >= a && hi <= b) return t[x];
    int mid = (lo + hi) >> 1;
    return get(x * 2, lo, mid, a, b) +
           get(x * 2 + 1, mid, hi, a, b);
  }

} T;

bool check(int x){
  T.reset();
  REP(i, m){
    if(sol[i] == x){
      if(rail[i].x > rail[i].y){
        T.update(1, 0, off, rail[i].x, n + 1);
        T.update(1, 0, off, 1, rail[i].y + 1);
      }
      else{
        T.update(1, 0, off, rail[i].x, rail[i].y + 1);
      }
    }
  }
  int sum = 0;
  REP(i, n)
    sum += T.get(1, 0, off, i + 1, i + 2);

  if(sum == n)
    return true;
  else
    return false;
}

int parent[MAXN];

int f(int x){
  if(parent[x] == x) return x;
  return par[x] = f(par[x]);
}

void spoji(int x, int y){
  x = f(x); y = f(y);
  if(x == y) return;
  parent[y] = x;
}

int main(){
  ios_base::sync_with_stdio(false); cin.tie(0);
  memset(par, -1, sizeof(par));

  cin >> n >> m;
  REP(i, m){
    int a, b; cin >> a >> b;
    rail[i] = event(a, b, i);
    parent[i] = i;

    if(a <= b)
      v.pb(event(a, b, i));
    if(a > b)
      v.pb(event(a, b + n, i));
    else
      v.pb(event(a + n, b + n, i));
  }
  sort(v.begin(), v.end());

  event curr = v[0];
  FOR(i, 1, sz(v)){
    if(curr.x <= v[i].x && curr.y >= v[i].y){
      par[ v[i].id ] = curr.id;
      spoji(curr.id, v[i].id);
    }

    if(curr.y < v[i].y)
      curr = v[i];
  }

  REP(i, m)
    if(f(i) == i)
      ev.pb(rail[i]);
  sort(ev.begin(), ev.end());

  for(int i = 0; i < sz(ev); i += 2)
    sol[ ev[i].id ] = true;
  REP(i, m){
    if(f(i) != i)
      sol[i] = !sol[ f(i) ] ;
  }

  if(check(0) && check(1))
    REP(i, m)
      cout << sol[i];
  else
    cout << "impossible";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2816 KB Output is correct
2 Correct 4 ms 2816 KB Output is correct
3 Correct 4 ms 2816 KB Output is correct
4 Incorrect 4 ms 2816 KB 'impossible' claimed, but there is a solution
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2816 KB Output is correct
2 Correct 4 ms 2816 KB Output is correct
3 Correct 4 ms 2816 KB Output is correct
4 Incorrect 4 ms 2816 KB 'impossible' claimed, but there is a solution
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2816 KB Output is correct
2 Correct 4 ms 2816 KB Output is correct
3 Correct 4 ms 2816 KB Output is correct
4 Incorrect 4 ms 2816 KB 'impossible' claimed, but there is a solution
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 109 ms 6976 KB Output is correct
2 Correct 36 ms 2816 KB Output is correct
3 Correct 54 ms 4912 KB Output is correct
4 Correct 69 ms 4980 KB Output is correct
5 Correct 124 ms 7912 KB Output is correct
6 Correct 90 ms 7516 KB Output is correct
7 Correct 114 ms 6880 KB Output is correct
8 Correct 39 ms 3072 KB Output is correct
9 Correct 39 ms 2936 KB Output is correct
10 Correct 134 ms 8112 KB Output is correct
11 Correct 103 ms 6460 KB Output is correct
12 Correct 106 ms 6608 KB Output is correct
13 Correct 20 ms 2816 KB Output is correct
14 Correct 19 ms 2788 KB Output is correct
15 Correct 120 ms 6984 KB Output is correct
16 Correct 48 ms 6132 KB Output is correct
17 Correct 134 ms 7008 KB Output is correct
18 Correct 97 ms 7008 KB Output is correct
19 Correct 22 ms 3136 KB Output is correct
20 Correct 99 ms 8208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2816 KB Output is correct
2 Correct 4 ms 2816 KB Output is correct
3 Correct 4 ms 2816 KB Output is correct
4 Incorrect 4 ms 2816 KB 'impossible' claimed, but there is a solution
5 Halted 0 ms 0 KB -