답안 #635225

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635225 2022-08-25T17:00:02 Z null_awe Flight to the Ford (BOI22_communication) C++17
74 / 100
3483 ms 2088 KB
#include <vector>
#include <set>
#include <iostream>
#include "communication.h"
using namespace std;

inline void s(int& x, int b, int v) { x -= (x & (1 << b)), x |= v << b; }

void encode(int n, int x) {
  set<int> todo; for (int i = 0; i < 30; ++i) todo.insert(i);
  vector<pair<int, int>> same, diff;
  int a = 0, b = 0; b |= 1;
  while (todo.size() > 1) {
    int b1 = *todo.begin(), b2 = *++todo.begin();
    vector<int> res(4);
    res[0] = send((x >> b1) & 1);
    res[1] = send((x >> b2) & 1);
    res[2] = send((x >> b2) & 1);
    res[3] = send((x >> b1) & 1);
    if (res[1] == res[2]) {
      a |= res[1] << b2, b |= res[1] << b2;
      todo.erase(b2);
    } else if (res[0] == res[3]) {
      s(a, b1, res[0]), s(b, b1, res[0]), s(b, b2, 1);
      int cur = b1;
      while (same.size() || diff.size()) {
        pair<int, int> l;
        if (same.size()) {
          for (int i = 0; i < same.size(); ++i) {
            if (same[i].second == cur) {
              swap(same[i], same[same.size() - 1]);
              break;
            }
          }
          l = same.back();
          if (l.second == cur) {
            s(a, l.first, (a >> cur) & 1);
            s(b, l.first, (b >> cur) & 1);
            cur = l.first;
            same.resize(same.size() - 1);
            continue;
          }
        }
        if (!diff.size()) break;
        for (int i = 0; i < diff.size(); ++i) {
          if (diff[i].second == cur) {
            swap(diff[i], diff[diff.size() - 1]);
            break;
          }
        }
        l = diff.back();
        if (l.second != cur) break;
        s(a, l.first, 1 - ((a >> cur) & 1));
        s(b, l.first, 1 - ((b >> cur) & 1));
        cur = l.first;
        diff.resize(diff.size() - 1);
      }
      todo.erase(b1);
    } else {
      int pa = (res[0] == res[1]), pb = 3 - pa;
      if (pa) diff.push_back({b1, b2});
      else same.push_back({b1, b2});
      if (a & (1 << b1)) a |= (pb & 1) << b2;
      else a |= (pa & 1) << b2;
      if (b & (1 << b1)) b |= (pb & 1) << b2;
      else b |= (pa & 1) << b2;
      todo.erase(b1);
    }
  }
}

pair<int, int> decode(int n) {
  set<int> todo; for (int i = 0; i < 30; ++i) todo.insert(i);
  vector<pair<int, int>> same, diff;
  int a = 0, b = 0; b |= 1;
  while (todo.size() > 1) {
    int b1 = *todo.begin(), b2 = *++todo.begin();
    vector<int> res(4);
    for (int i = 0; i < 4; ++i) res[i] = receive();
    if (res[1] == res[2]) {
      a |= res[1] << b2, b |= res[1] << b2;
      todo.erase(b2);
    } else if (res[0] == res[3]) {
      s(a, b1, res[0]), s(b, b1, res[0]), s(b, b2, 1);
      int cur = b1;
      while (same.size() || diff.size()) {
        pair<int, int> l;
        if (same.size()) {
          for (int i = 0; i < same.size(); ++i) {
            if (same[i].second == cur) {
              swap(same[i], same[same.size() - 1]);
              break;
            }
          }
          l = same.back();
          if (l.second == cur) {
            s(a, l.first, (a >> cur) & 1);
            s(b, l.first, (b >> cur) & 1);
            cur = l.first;
            same.resize(same.size() - 1);
            continue;
          }
        }
        if (!diff.size()) break;
        for (int i = 0; i < diff.size(); ++i) {
          if (diff[i].second == cur) {
            swap(diff[i], diff[diff.size() - 1]);
            break;
          }
        }
        l = diff.back();
        if (l.second != cur) break;
        s(a, l.first, 1 - ((a >> cur) & 1));
        s(b, l.first, 1 - ((b >> cur) & 1));
        cur = l.first;
        diff.resize(diff.size() - 1);
      }
      todo.erase(b1);
    } else {
      int pa = (res[0] == res[1]), pb = 3 - pa;
      if (pa) diff.push_back({b1, b2});
      else same.push_back({b1, b2});
      if (a & (1 << b1)) a |= (pb & 1) << b2;
      else a |= (pa & 1) << b2;
      if (b & (1 << b1)) b |= (pb & 1) << b2;
      else b |= (pa & 1) << b2;
      todo.erase(b1);
    }
  }
  return {max(min(a, n), 1), max(min(b, n), 1)};
}

Compilation message

communication.cpp: In function 'void encode(int, int)':
communication.cpp:29:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |           for (int i = 0; i < same.size(); ++i) {
      |                           ~~^~~~~~~~~~~~~
communication.cpp:45:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |         for (int i = 0; i < diff.size(); ++i) {
      |                         ~~^~~~~~~~~~~~~
communication.cpp: In function 'std::pair<int, int> decode(int)':
communication.cpp:89:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |           for (int i = 0; i < same.size(); ++i) {
      |                           ~~^~~~~~~~~~~~~
communication.cpp:105:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |         for (int i = 0; i < diff.size(); ++i) {
      |                         ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 99 ms 1744 KB Output is correct
2 Correct 96 ms 1664 KB Output is correct
3 Correct 200 ms 1724 KB Output is correct
4 Correct 117 ms 1700 KB Output is correct
5 Correct 135 ms 1808 KB Output is correct
6 Correct 352 ms 1804 KB Output is correct
7 Correct 657 ms 1708 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 908 ms 1672 KB Output is partially correct
2 Partially correct 419 ms 1672 KB Output is partially correct
3 Partially correct 552 ms 1952 KB Output is partially correct
4 Partially correct 848 ms 1804 KB Output is partially correct
5 Partially correct 801 ms 1696 KB Output is partially correct
6 Partially correct 666 ms 1716 KB Output is partially correct
7 Partially correct 2373 ms 1912 KB Output is partially correct
8 Partially correct 3276 ms 1976 KB Output is partially correct
9 Partially correct 3270 ms 2000 KB Output is partially correct
10 Partially correct 2965 ms 1852 KB Output is partially correct
11 Partially correct 2953 ms 2088 KB Output is partially correct
12 Partially correct 2839 ms 1988 KB Output is partially correct
13 Partially correct 3205 ms 1992 KB Output is partially correct
14 Partially correct 3282 ms 1804 KB Output is partially correct
15 Partially correct 1545 ms 1792 KB Output is partially correct
16 Partially correct 3483 ms 1800 KB Output is partially correct
17 Partially correct 917 ms 1892 KB Output is partially correct
18 Partially correct 909 ms 1892 KB Output is partially correct
19 Partially correct 697 ms 1816 KB Output is partially correct
20 Partially correct 754 ms 1788 KB Output is partially correct
21 Partially correct 868 ms 1732 KB Output is partially correct
22 Partially correct 923 ms 1728 KB Output is partially correct
23 Partially correct 1242 ms 1748 KB Output is partially correct
24 Correct 114 ms 1684 KB Output is correct
25 Correct 84 ms 1728 KB Output is correct
26 Correct 212 ms 1716 KB Output is correct
27 Correct 99 ms 1744 KB Output is correct
28 Correct 155 ms 1680 KB Output is correct
29 Correct 377 ms 1876 KB Output is correct
30 Correct 826 ms 1660 KB Output is correct