Submission #210529

#TimeUsernameProblemLanguageResultExecution timeMemory
210529kshitij_sodaniSnake Escaping (JOI18_snake_escaping)C++17
0 / 100
83 ms65536 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back typedef long long llo; #define a first #define b second #define endl "\n" llo aa=7; vector<llo> aac[1000001]; vector<llo> pre[130]; llo sl3[21]; llo sl[22]; llo l; llo dp[1600000];//3^13 llo last[1600000];//3^13 llo ans[1000001];//q llo it[1100001];//n llo num[1000001];//q llo ok; void find(llo ind,llo tot,llo ind2){//pre_sub if(ind==aa){ pre[tot].pb(ind2); // cout<<tot<<" "<<ind2<<endl; } else{ if(aac[ind2][ind]%2==0){ find(ind+1,tot,ind2); } if(aac[ind2][ind]>0){ find(ind+1,tot+sl[aa-ind-1],ind2); } } } void find2(llo ind,llo ind2,llo tot=0){// if(ind==l-aa){ last[tot]=ind2; // cout<<tot<<","<<ind2<<endl; return; } if(ind==ind2){ find2(ind+1,ind2,tot+2*sl3[(l-aa)-ind-1]); } else{ find2(ind+1,ind2,tot); find2(ind+1,ind2,tot+sl3[(l-aa)-ind-1]); } if(ind<ind2){ find2(ind+1,ind2,tot+2*sl3[(l-aa)-ind-1]); } } llo find3(llo ind){//dp if(dp[ind]>-1){ return dp[ind]; } if(last[ind]==-1){ dp[ind]=it[ind+ok*(sl[l-aa])]; return dp[ind]; } dp[ind]=find3(ind-sl3[l-aa-last[ind]-1])+find3(ind-2*sl3[l-aa-last[ind]-1]); return dp[ind]; } //void(llo) int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); memset(last,-1,sizeof(last)); memset(num,0,sizeof(num)); sl[0]=1; for(llo i=1;i<22;i++){ sl[i]=2*sl[i-1]; } sl3[0]=1; for(llo i=1;i<14;i++){ sl3[i]=3*sl3[i-1]; } llo q; cin>>l>>q; aa=min((llo)13,l); llo n=sl[l]; char ss; for(llo i=0;i<n;i++){ cin>>ss; it[i]=ss-'0'; } for(llo ii=0;ii<q;ii++){ for(llo i=0;i<l;i++){ cin>>ss; if(ss=='0'){ aac[ii].pb(0); if(l==1){ cout<<it[0]<<endl; } } else if(ss=='1'){ aac[ii].pb(1); if(l==1){ cout<<it[1]<<endl; } else{ if(i>=aa){ num[ii]+=sl3[l-i-1]; } } } else{ aac[ii].pb(2); if(l==1){ cout<<it[0]+it[1]<<endl; } else{ if(i>=aa){ num[ii]+=2*sl3[l-i-1]; } } } } } /*for(llo i=0;i<q;i++){ cout<<num[i]<<" "; } cout<<endl;*/ if(l==1){ return 0; } for(llo i=0;i<q;i++){ find((llo)0,(llo)0,i); } memset(ans,(llo)0,sizeof(ans)); for(llo i=0;i<l-aa;i++){ find2((llo)0,i,(llo)0); } for(llo i=0;i<130;i++){ ok=i; if(pre[i].size()){ /* memset(dp,(llo)-1,sizeof(dp)); for(llo j=0;j<1600000;j++){ find3(j); }*/ for(auto j:pre[i]){ ans[j]+=it[i]; //ans[j]+=dp[num[j]]; // cout<<i<<":"<<j<<":"<<dp[num[j]]<<endl; } } } for(llo i=0;i<q;i++){ cout<<ans[i]<<endl; } return 0; }
#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...