空间开到inf了,照样RE 代码如下:
#include<iostream>
#include<string>
#define maxn 0xffffff
using namespace std;
int tree[maxn],maxi[maxn][2],mini[maxn][2];
void build(int i){
char c;
cin>>c;
int n=c-'0';
tree[i]=n;
if(n>0)build(i<<1);//问题在这里,我怎么用i<<1而不是++i过
if(n>1)build(i<<1|1);
}
void dfs(int i){
if(!tree[i]){
maxi[i][0]=mini[i][0]=0;
maxi[i][1]=mini[i][1]=1;
return;
}
dfs(i<<1);
if(tree[i]>1)dfs(i<<1|1);
maxi[i][1]=maxi[i<<1][0]+maxi[i<<1|1][0]+1;
maxi[i][0]=max(maxi[i<<1][0]+maxi[i<<1|1][1],maxi[i<<1][1]+maxi[i<<1|1][0]);
mini[i][1]=mini[i<<1][0]+mini[i<<1|1][0]+1;
mini[i][0]=min(mini[i<<1][0]+mini[i<<1|1][1],mini[i<<1][1]+mini[i<<1|1][0]);
}
int main(){
build(1);
dfs(1);
cout<<max(maxi[1][0],maxi[1][1])<<' '<<min(mini[1][0],mini[1][1]);
return 0;
}
当然我知道怎么能过,我就是想问一下怎么样这种方法才能过