记录编号 413078 评测结果 AAAAAAAAAAAAA
题目名称 [POI 1999] 三色二叉树 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 0.012 s
提交时间 2017-06-10 18:44:55 内存使用 0.83 MiB
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
#define for1(a,b,i) for(int i=a;i<=b;i++)
#define for11(a,b,i)for(int i=a;i<b;i++)
#define for2(a,b,i) for(int i=a;i>=b;i--)
#define for22(a,b,i)for(int i=a;i>b;i--)
#define maxx(a,b) (a)>(b)?(a):(b)
#define minn(a,b) (a)<(b)?(a):(b)
char a[10010];
struct shu
{
   int ls,rs,fa,data,ji;
   shu(){ls=-1;rs=-1;fa=-1;data=0;ji=0;}       
}tree[10010];
int l;int fmax[10010][5],fmin[10010][5];
inline void wpyqsy()
{
   scanf("%s",&a);
   l=strlen(a);
   for2(l,1,i)
   {
     a[i]=a[i-1];tree[i].data=a[i]-'0';
     if(tree[i].data>0)
     {
       tree[i].ls=i+1;tree[i+1].fa=i;tree[i].ji+=1;                  
     }           
   }  
   tree[1].fa=0;
   for1(2,l,i)
     if(tree[i].fa==-1) 
         for2(i-1,1,j)
         if(tree[j].ji<tree[j].data)
         {
            tree[j].rs=i;tree[j].ji+=1;
            tree[i].fa=j;break;                          
         }  
   memset(fmax,0,sizeof(fmax));  
   memset(fmin,0,sizeof(fmin));                        
   return ;             
}//0 bu 1 xuan
inline void dp1(int x)
{
   fmax[x][0]=0;fmax[x][1]=1;
   if(tree[x].ls!=-1) dp1(tree[x].ls);
   if(tree[x].rs!=-1) dp1(tree[x].rs);
   if(tree[x].ls!=-1)
   {
     fmax[x][1]+=(fmax[tree[x].ls][0]+fmax[tree[x].rs][0]); 
     fmax[x][0]+=maxx(fmax[tree[x].ls][1]+fmax[tree[x].rs][0],fmax[tree[x].ls][0]+fmax[tree[x].rs][1]);                 
   }    
   return ;  
}
inline void dp2(int x)
{
   fmin[x][0]=0;fmin[x][1]=1;
   if(tree[x].ls!=-1) dp2(tree[x].ls);
   if(tree[x].rs!=-1) dp2(tree[x].rs);
   if(tree[x].ls!=-1)
   {
     fmin[x][1]+=(fmin[tree[x].ls][0]+fmin[tree[x].rs][0]); 
     fmin[x][0]+=minn(fmin[tree[x].ls][1]+fmin[tree[x].rs][0],fmin[tree[x].ls][0]+fmin[tree[x].rs][1]);                 
   }    
   return ;  
}
inline void love()
{
   dp1(1);dp2(1);return ;
}
int main()
{
    freopen("trot.in","r",stdin);
    freopen("trot.out","w",stdout);
    wpyqsy();
    love();
    fmax[1][2]=maxx(fmax[1][0],fmax[1][1]);
    fmin[1][2]=minn(fmin[1][0],fmin[1][1]);
    cout<<fmax[1][2]<<" "<<fmin[1][2]; 
    //while(1);
}