답안 #520243

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
520243 2022-01-29T02:07:43 Z christinelynn Swap (BOI16_swap) C++17
컴파일 오류
0 ms 0 KB
#include<bits/stdc++.h>
#define ll int
#define ld long double
#define fs first
#define sc second
#define debug(y) cout<<y,exit(0)
using namespace std;
typedef pair<ll,ll> LL;
const ll N = 2e5 + 9;
const ll inf = 1e9 + 7;
 
vector<ll> dp[N][18][2];
ll n,a[N];
bool need[N][18][2];
 
void Merge(vector<ll> &res,vector<ll> &a,vector<ll> &b){
      for (ll i = 0,j = 1;i < a.size();i += j,j *= 2){
                for (ll k = i;k < i + j && k < a.size();k++) res.push_back(a[k]);
                for (ll k = i;k < i + j && k < b.size();k++) res.push_back(b[k]);
      }
}
 
int main(){
      ios_base::sync_with_stdio(NULL); cin.tie(0); cout.tie(0);
      #define task "test"
      if (fopen(task".inp","r")){
                freopen(task".inp","r",stdin);
                //freopen(task".out","w",stdout);
      }
      cin>>n;
      for (ll i = 1;i <= n;i++) cin>>a[i];
      need[1][0][1] = 1;
   
      for (ll node = 1;node <= n/2;node++){
                for (ll i = 0;node >> i;i++){
                              for (auto j : {0,1}){
                                                if (!need[node][i][j]) continue;
                                                ll p = ((node >> i + 1) << 1) + j;
                                                ll mn = min({a[p],a[node*2],a[node*2 + 1]});
                                                if (mn == a[node*2])
                                                                      need[2*node][i + 1][j] = need[2*node + 1][0][1] = 1;
                                                else if (mn == a[p])
                                                                      need[2*node][0][0] = need[2*node + 1][0][1] = 1;
                                                else
                                                                      need[2*node][0][0] = need[2*node + 1][0][0] = 1,
                                                    need[2*node][i + 1][j] = need[2*node + 1][i + 1][j] = 1;
                              }
                }
      }
   
      for (ll node = n;node;node--){
                for (ll i = 0;node >> i;i++){
                              for (auto j : {0,1}){
                                                if (!need[node][i][j]) continue;
                                 
                                                ll p = ((node >> i + 1) << 1) + j;
                                                if (2*node > n) dp[node][i][j] = {a[p]};
                                                else if (2*node == n) dp[node][i][j] = {min(a[p],a[node*2]),max(a[p],a[node*2])};
                                                else{
                                                                      ll mn = min({a[p],a[2*node],a[2*node + 1]});
                                                                      if (mn == a[2*node + 1]){
                                                                                                vector<ll> tmp1,tmp2; tmp1 = tmp2 = {a[2*node + 1]};
                                                                                                Merge(tmp1,dp[2*node][0][0],dp[2*node + 1][i + 1][j]);
                                                                                                Merge(tmp2,dp[2*node][i + 1][j],dp[2*node + 1][0][0]);
                                                                                                dp[node][i][j] = min(tmp1,tmp2);
                                                                      }
                                                                      else{
                                                                                                dp[node][i][j] = {min(a[p],a[2*node])};
                                                                                                if (mn == a[p])
                                                                                                                              Merge(dp[node][i][j],dp[2*node][0][0],dp[2*node + 1][0][1]);
                                                                                                else
                                                                                                                              Merge(dp[node][i][j],dp[2*node][i + 1][j],dp[2*node + 1][0][1]);
                                                                      }
                                                }
                              }
                }
                if (2*node < n){
                              for (ll i = 0;2*node >> i;i++){
                                                for (auto j : {0,1})
                                                                      vector<ll>().swap(dp[2*node][i][j]),
                                                    vector<ll>().swap(dp[2*node + 1][i][j]);
                              }
                }
      }
      for (auto i : dp[1][0][1]) cout<<i<<" ";
}
 
/* stuff you should look for
  * int overflow, array bounds
    * special cases (n=1?)
      * do smth instead of nothing and stay organized
        * WRITE STUFF DOWN
          * DON'T GET STUCK ON ONE APPROACH
          */
                              }
                }
                                                                      }
                                                                      }
                                                }
                              }
                }
      }
                              }
                }
      }
      }
}
      }
}

Compilation message

swap.cpp: In function 'void Merge(std::vector<int>&, std::vector<int>&, std::vector<int>&)':
swap.cpp:17:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |       for (ll i = 0,j = 1;i < a.size();i += j,j *= 2){
      |                           ~~^~~~~~~~~~
swap.cpp:18:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |                 for (ll k = i;k < i + j && k < a.size();k++) res.push_back(a[k]);
      |                                            ~~^~~~~~~~~~
swap.cpp:19:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |                 for (ll k = i;k < i + j && k < b.size();k++) res.push_back(b[k]);
      |                                            ~~^~~~~~~~~~
swap.cpp: In function 'int main()':
swap.cpp:38:68: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |                                                 ll p = ((node >> i + 1) << 1) + j;
      |                                                                  ~~^~~
swap.cpp:56:68: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   56 |                                                 ll p = ((node >> i + 1) << 1) + j;
      |                                                                  ~~^~~
swap.cpp: At global scope:
swap.cpp:95:31: error: expected declaration before '}' token
   95 |                               }
      |                               ^
swap.cpp:96:17: error: expected declaration before '}' token
   96 |                 }
      |                 ^
swap.cpp:97:71: error: expected declaration before '}' token
   97 |                                                                       }
      |                                                                       ^
swap.cpp:98:71: error: expected declaration before '}' token
   98 |                                                                       }
      |                                                                       ^
swap.cpp:99:49: error: expected declaration before '}' token
   99 |                                                 }
      |                                                 ^
swap.cpp:100:31: error: expected declaration before '}' token
  100 |                               }
      |                               ^
swap.cpp:101:17: error: expected declaration before '}' token
  101 |                 }
      |                 ^
swap.cpp:102:7: error: expected declaration before '}' token
  102 |       }
      |       ^
swap.cpp:103:31: error: expected declaration before '}' token
  103 |                               }
      |                               ^
swap.cpp:104:17: error: expected declaration before '}' token
  104 |                 }
      |                 ^
swap.cpp:105:7: error: expected declaration before '}' token
  105 |       }
      |       ^
swap.cpp:106:7: error: expected declaration before '}' token
  106 |       }
      |       ^
swap.cpp:107:1: error: expected declaration before '}' token
  107 | }
      | ^
swap.cpp:108:7: error: expected declaration before '}' token
  108 |       }
      |       ^
swap.cpp:109:1: error: expected declaration before '}' token
  109 | }
      | ^
swap.cpp: In function 'int main()':
swap.cpp:27:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~