空间浪费玩家求优化
查看原帖
空间浪费玩家求优化
233127
千叶の黑猫楼主2020/7/24 16:40
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int  maxn = 1000050;
char ai[maxn];
short dp[maxn*140][3];
short dpp[maxn*140][3];
bool f[maxn*140];
int cnt;
bool flag[maxn*140];
void dfs(int k,int mark){
    if(ai[k]=='0') return ;
    if(ai[k]=='1') {
      flag[mark<<1]=1;
      dfs(++cnt,mark<<1);
    }
    if(ai[k]=='2') {
      flag[mark<<1]=1;
      flag[mark<<1|1]=1;
      dfs(++cnt,mark<<1);
      dfs(++cnt,mark<<1|1);
    } 
}
void dppp(int k){
  f[k]=1;
  if(!flag[k<<1]&&!flag[k<<1|1]) {dp[k][0]=1;dpp[k][0]=1;return ;}
  if(flag[k<<1]&&!f[k<<1]) dppp(k<<1);
  if(flag[k<<1|1]&&!f[k<<1|1]) dppp(k<<1|1);
  if(flag[k<<1|1]&&flag[k<<1]){
     dp[k][0] = max(dp[k<<1][1]  + dp[k<<1|1][2], dp[k<<1][2] + dp[k<<1|1][1]) + 1;
		 dp[k][1] = max(dp[k<<1][0]  + dp[k<<1|1][2], dp[k<<1][2] + dp[k<<1|1][0]);
		 dp[k][2] = max(dp[k<<1][0]  + dp[k<<1|1][1], dp[k<<1][1] + dp[k<<1|1][0]);
    dpp[k][0] = min(dpp[k<<1][1] + dpp[k<<1|1][2], dpp[k<<1][2] + dpp[k<<1|1][1]) + 1;
		dpp[k][1] = min(dpp[k<<1][0] + dpp[k<<1|1][2], dpp[k<<1][2] + dpp[k<<1|1][0]);
		dpp[k][2] = min(dpp[k<<1][0] + dpp[k<<1|1][1], dpp[k<<1][1] + dpp[k<<1|1][0]);
  }
  else if(flag[k<<1]){
     dp[k][0] = max(dp[k<<1][1],dp[k<<1][2])+1;
     dp[k][1] = max(dp[k<<1][0],dp[k<<1][2]);
     dp[k][2] = max(dp[k<<1][0],dp[k<<1][1]);
    dpp[k][0] = min(dpp[k<<1][1],dpp[k<<1][2])+1;
    dpp[k][1] = min(dpp[k<<1][0],dpp[k<<1][2]);
    dpp[k][2] = min(dpp[k<<1][0],dpp[k<<1][1]);
  }
}
int main(){
   scanf("%s",ai+1);
   dfs(++cnt,1);
   dppp(1);
   cout<<max(dp[1][0],max(dp[1][1],dp[1][2]));
   cout<<" ";
   cout<<min(dpp[1][0],min(dpp[1][1],dpp[1][2]));
}
2020/7/24 16:40
加载中...