ZJOI2006 三色二叉树
Posted hankeke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJOI2006 三色二叉树相关的知识,希望对你有一定的参考价值。
Time Limit: 1 Sec Memory Limit: 64 MB
Description
Input
仅有一行,不超过(500000)个字符,表示一个二叉树序列。
Output
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
Sample Input
1122002010
Sample Output
5 2
Source
Solution
没有意思的树形DP题,其实不太想做这种一眼题,没有成绩就感,而且看见自己没有一遍过还会很伤心。
显而易见的状态(dp[i][3]),后面的的(3)分别是(0,1,2),分表表示红绿蓝。
其实貌似不用设那么多,直接设一个是不是绿色就可以了,但是已经这样写了就不想改了。
随便转移转移就好了。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define lowbit(x) ((x)&(-(x)))
#define REP(i,a,n) for(register int i=(a);i<=(n);++i)
#define PER(i,a,n) for(register int i=(a);i>=(n);--i)
#define FEC(i,x) for(register int i=head[x];i;i=g[i].ne)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
namespace io{
const int SIZE=(1<<21)+1;char ibuf[SIZE],*iS,*iT,obuf[SIZE],*oS=obuf,*oT=oS+SIZE-1,c,qu[55];int f,qr;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
inline int getc(){return gc();}
inline void putc(char x){*oS++=x;if(oS==oT)flush();}
template<class I>inline void read(I &x){for(f=1,c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=gc())x=x*10+(c&15);x*=f;}
template<class I>inline void write(I x){if(!x)putc('0');if(x<0)putc('-'),x=-x;while(x)qu[++qr]=x%10+'0',x/=10;while(qr)putc(qu[qr--]);}
inline void print(const char *s){while(*s!='