【暴力】vijos P1897 学姐吃牛排
2014-11-01 08:09
225 查看
判断堆:递归判断每个节点的孩子是否都比其父亲大(小)。
判断BST:中序遍历是否有序。
判断BST:中序遍历是否有序。
#include<cstdio> using namespace std; #define lc (rt<<1) #define rc (rt<<1|1) int T,n,a[1001],b[1001],en; void Mid(int rt) { if(lc<=n) Mid(lc); b[++en]=a[rt]; if(rc<=n) Mid(rc); } bool is_BST() { bool f1=1,f2=1; en=0; Mid(1); for(int i=2;i<=n;i++) if(b[i]<b[i-1]) {f1=0; break;} if(f1) return 1; for(int i=2;i<=n;i++) if(b[i]>b[i-1]) {f2=0; break;} if(f2) return 1; return 0; } bool is_Heap(int rt) { if(lc<=n) { if(a[lc]>a[rt]) return 0; if(!is_Heap(lc)) return 0; } if(rc<=n) { if(a[rc]>a[rt]) return 0; if(!is_Heap(rc)) return 0; } return 1; } bool is_Heap_2(int rt) { if(lc<=n) { if(a[lc]<a[rt]) return 0; if(!is_Heap_2(lc)) return 0; } if(rc<=n) { if(a[rc]<a[rt]) return 0; if(!is_Heap_2(rc)) return 0; } return 1; } int main() { scanf("%d",&T); for(int i=1;i<=T;i++) { printf("Case #%d: ",i); scanf("%d",&n); for(int j=1;j<=n;j++) scanf("%d",&a[j]); bool flag1=0,flag2=0; if(is_BST()) flag1=1; if(is_Heap(1)) flag2=1; if((!flag2)) if(is_Heap_2(1)) flag2=1; if(flag1&&flag2) puts("Both"); else if(flag1) puts("BST"); else if(flag2) puts("Heap"); else puts("Neither"); } return 0; }
相关文章推荐
- 学姐吃牛排[Vijos1987]解题报告
- Vijos 字符串还原(大大大暴力)
- Vijos P1901 学姐的钱包
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
- vijos1891 学姐的逛街计划(线性规划)
- vijos1904 学姐的幸运数字
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
- [vijos1897]学姐吃牛排(dfs+heap+bst)
- Vijos1901 学姐的钱包
- Vijos 1028-魔族密码【暴力】
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
- Vijos之暴力枚举
- vijos 1059 积木城堡【暴力】
- CDOJ 1292 卿学姐种花(暴力,分块,线段树)
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
- vijos1891 学姐的逛街计划(线性规划)
- Vijos P1901 学姐的钱包
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
- Vijos 1901 学姐的钱包(线段树优化dp)
- Vijos P1786 质因数分解【暴力】