Submission #1137007

#TimeUsernameProblemLanguageResultExecution timeMemory
1137007onlk97Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
1140 ms32912 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #define int long long #define double long double #define x first #define y second #define pb push_back using namespace std; using namespace __gnu_pbds; using pii=pair <int,int>; using tii=pair <pii,int>; void solve(){ int n,q; cin>>n>>q; int a[1<<n]; for (int i=0; i<(1<<n); i++){ char c; cin>>c; a[i]=(c-'0'); } int s[1<<n],rs[1<<n]; for (int i=0; i<(1<<n); i++) s[i]=rs[i]=a[i]; for (int b=0; b<n; b++){ for (int i=0; i<(1<<n); i++){ if (i&(1<<b)) s[i]+=s[i^(1<<b)]; } } for (int b=0; b<n; b++){ for (int i=(1<<n)-1; i>=0; i--){ if (!(i&(1<<b))) rs[i]+=rs[i^(1<<b)]; } } while (q--){ string str; cin>>str; vector <int> f[3]; for (int i=0; i<n; i++){ if (str[i]=='0') f[0].pb(n-1-i); else if (str[i]=='1') f[1].pb(n-1-i); else f[2].pb(n-1-i); } int sz[3]={f[0].size(),f[1].size(),f[2].size()}; int ans=0,ths=0; for (int i:f[1]) ths+=(1<<i); if (sz[2]<=min(sz[0],sz[1])){ for (int mask=0; mask<(1<<sz[2]); mask++){ int tp=ths; for (int j=0; j<sz[2]; j++){ if (mask&(1<<j)) tp+=(1<<f[2][j]); } ans+=a[tp]; } } else if (sz[1]<=min(sz[0],sz[2])){ for (int i:f[2]) ths+=(1<<i); for (int mask=0; mask<(1<<sz[1]); mask++){ int tp=ths,sn=0; for (int j=0; j<sz[1]; j++){ if (mask&(1<<j)){ tp-=(1<<f[1][j]); sn^=1; } } ans+=s[tp]*(sn==0?1:-1); } } else { for (int mask=0; mask<(1<<sz[0]); mask++){ int tp=ths,sn=0; for (int j=0; j<sz[0]; j++){ if (mask&(1<<j)){ tp+=(1<<f[0][j]); sn^=1; } } ans+=rs[tp]*(sn==0?1:-1); } } cout<<ans<<'\n'; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t=1; //cin>>t; while (t--) solve(); }

Compilation message (stderr)

snake_escaping.cpp: In function 'void solve()':
snake_escaping.cpp:41:29: warning: narrowing conversion of 'f[0].std::vector<long long int>::size()' from 'std::vector<long long int>::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
   41 |         int sz[3]={f[0].size(),f[1].size(),f[2].size()};
      |                    ~~~~~~~~~^~
snake_escaping.cpp:41:41: warning: narrowing conversion of 'f[1].std::vector<long long int>::size()' from 'std::vector<long long int>::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
   41 |         int sz[3]={f[0].size(),f[1].size(),f[2].size()};
      |                                ~~~~~~~~~^~
snake_escaping.cpp:41:53: warning: narrowing conversion of 'f[2].std::vector<long long int>::size()' from 'std::vector<long long int>::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
   41 |         int sz[3]={f[0].size(),f[1].size(),f[2].size()};
      |                                            ~~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...