제출 #714886

#제출 시각아이디문제언어결과실행 시간메모리
714886ibrahim001Boarding Passes (BOI22_passes)C++14
100 / 100
572 ms32804 KiB
#include "bits/stdc++.h" #define intt long long #define pb push_back #define endl '\n' #define F first #define S second #define pii pair<int,int> #define pll pair<intt,intt> #define ld long double using namespace std; const int G = 16; const int N = 2e5+5; const ld inf = 1e18; const ld one = 1; const ld two = 2; ld self[G][N]; int cnt[G][N]; ld psum[G][G][N]; vector<int>ind[G]; int mp[150], used[150]; ld cost(int j, vector<int> vb, int k){ ld res = self[j][k]; for ( int i : vb ){ if ( i == j ) continue; res += psum[j][i][k]; } return res; } int i,j; int main(){ string s; cin >> s; int n = s.size(); int g = 0; for ( char c : s ) if ( !used[c] ) mp[c] = g++, used[c]=true; for ( i = 0; i < s.size(); i++ ){ ind[mp[s[i]]].pb(i+1); } for ( int i = 0; i < g; i++ ){ int sz = ind[i].size(); self[i][0] = one*sz*(sz-1)/4; for ( j = 1; j <= sz; j++ ){ self[i][j] = self[i][j-1]-(sz-j)/two + (j-1)/two; } } for ( i = 1; i <= n; i++ ){ for ( j = 0; j < g; j++ ){ cnt[j][i] = cnt[j][i-1]; } cnt[mp[s[i-1]]][i]++; } for ( i = 0; i < g; i++ ){ for ( j = 0; j < g; j++ ){ if ( i == j ) continue; for ( int l : ind[i] ){ psum[i][j][0] += cnt[j][n] - cnt[j][l]; } for ( int l = 1; l <= ind[i].size(); l++ ){ psum[i][j][l] = psum[i][j][l-1] - (cnt[j][n]-cnt[j][ind[i][l-1]]) + cnt[j][ind[i][l-1]]; } } } vector<ld>dp(1<<g, 1e18); dp[0] = 0; for ( i = 1; i < (1<<g); i++ ){ vector<int>vb; for ( j = 0; j < g; j++ ){ if ( i&(1<<j) ) vb.pb(j); } for ( int j : vb ){ int low = 0, high = ind[j].size(), mid, best; while (2 < high-low){ mid = (low+high)>>1; ld c1 = cost(j, vb, mid), c2=cost(j, vb, mid+1); if ( c1 > c2 ){ low = mid; } else{ high = mid+1; } } ld mincost = inf; for ( int l = low; l <= high; l++ ) mincost = min(mincost, cost(j, vb, l)); dp[i] = min(dp[i], dp[i^(1<<j)] + mincost); } } cout << setprecision(9) << fixed << dp[(1<<g)-1] << endl; }

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

passes.cpp: In function 'int main()':
passes.cpp:35:36: warning: array subscript has type 'char' [-Wchar-subscripts]
   35 |     for ( char c : s )  if ( !used[c] )   mp[c] = g++, used[c]=true;
      |                                    ^
passes.cpp:35:46: warning: array subscript has type 'char' [-Wchar-subscripts]
   35 |     for ( char c : s )  if ( !used[c] )   mp[c] = g++, used[c]=true;
      |                                              ^
passes.cpp:35:61: warning: array subscript has type 'char' [-Wchar-subscripts]
   35 |     for ( char c : s )  if ( !used[c] )   mp[c] = g++, used[c]=true;
      |                                                             ^
passes.cpp:36:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for ( i = 0; i < s.size(); i++ ){
      |                  ~~^~~~~~~~~~
passes.cpp:37:20: warning: array subscript has type 'char' [-Wchar-subscripts]
   37 |         ind[mp[s[i]]].pb(i+1);
      |                    ^
passes.cpp:50:22: warning: array subscript has type 'char' [-Wchar-subscripts]
   50 |         cnt[mp[s[i-1]]][i]++;
      |                      ^
passes.cpp:58:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |             for ( int l = 1; l <= ind[i].size(); l++ ){
      |                              ~~^~~~~~~~~~~~~~~~
passes.cpp:71:53: warning: unused variable 'best' [-Wunused-variable]
   71 |             int low = 0, high = ind[j].size(), mid, best;
      |                                                     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...