답안 #291931

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
291931 2020-09-06T03:39:30 Z tatyam Languages (IOI10_languages) C++17
101 / 100
2135 ms 140500 KB
#include "grader.h"
#include "lang.h"
#include <bits/stdc++.h>
using namespace std;
using u64 = uint64_t;

#define C(n) \
auto comp ## n = [](const array<int, n>& a){ u64 ans = 0; for(int i : a){ ans <<= 16; ans |= i; } return ans; };\
unordered_map<array<int, n>, array<int, 56>, decltype(comp ## n)> c ## n(1 << 17, comp ## n)
C(1);
C(2);
C(3);
C(4);
array<int, 56> cnt;
const double A = 208.171, B = 2401.08, C = 331.18, D = 3741.06;

void excerpt(int *E) {
   cnt.fill(0);
   for(int i = 0; i <= 100 - 1; i++){
      auto& c = c1[{E[i]}];
      int s = accumulate(c.begin(), c.end(), 0);
      if(!s) continue;
      for(int i = 0; i < 56; i++) cnt[i] += double(c[i]) / s * A;
   }
   for(int i = 0; i <= 100 - 2; i++){
      auto& c = c2[{E[i], E[i + 1]}];
      int s = accumulate(c.begin(), c.end(), 0);
      if(!s) continue;
      for(int i = 0; i < 56; i++) cnt[i] += double(c[i]) / s * B;
   }
   for(int i = 0; i <= 100 - 3; i++){
      auto& c = c3[{E[i], E[i + 1], E[i + 2]}];
      int s = accumulate(c.begin(), c.end(), 0);
      if(!s) continue;
      for(int i = 0; i < 56; i++) cnt[i] += double(c[i]) / s * C;
   }
   for(int i = 0; i <= 100 - 4; i++){
      auto& c = c4[{E[i], E[i + 1], E[i + 2], E[i + 3]}];
      int s = accumulate(c.begin(), c.end(), 0);
      if(!s) continue;
      for(int i = 0; i < 56; i++) cnt[i] += double(c[i]) / s * D;
   }
 
   int ans = language(max_element(cnt.begin(), cnt.end()) - cnt.begin());
 
   for(int i = 0; i <= 100 - 1; i++){
      auto& c = c1[{E[i]}];
      c[ans]++;
   }
   for(int i = 0; i <= 100 - 2; i++){
      auto& c = c2[{E[i], E[i + 1]}];
      c[ans]++;
   }
   for(int i = 0; i <= 100 - 3; i++){
      auto& c = c3[{E[i], E[i + 1], E[i + 2]}];
      c[ans]++;
   }
   for(int i = 0; i <= 100 - 4; i++){
      auto& c = c4[{E[i], E[i + 1], E[i + 2], E[i + 3]}];
      c[ans]++;
   }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2089 ms 140500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2135 ms 140408 KB Output is correct - 92.29%