bzoj 1149 [CTSC2007]风玲Mobiles dfs
2017-02-19 22:23
357 查看
题意:给定一棵完全二叉树,可以交换某个节点的左右儿子,求最少交换多少次可以使所有的叶节点深度相差不超过1,且深度较大的叶节点都在深度较小的叶节点左侧(来自po姐)。
题解:其实这题你看懂题目你就赢了。。。直接做。。这应该是CTSC中最水的一道了巴。dfs两遍,随便跑。然而并没有1A,因为空间开小了。。。
题解:其实这题你看懂题目你就赢了。。。直接做。。这应该是CTSC中最水的一道了巴。dfs两遍,随便跑。然而并没有1A,因为空间开小了。。。
#include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #include<iostream> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; typedef long long ll; const int N=1e6; int l ,r ,ans,minx=1e9,maxx,n; inline void dfs(int x,int dep) { if (x==-1) { maxx=max(maxx,dep); minx=min(minx,dep); return; } dfs(l[x],dep+1); dfs(r[x],dep+1); } inline int solve(int x,int dep) { int a,b; if (x==-1) { if (dep==minx)return 1; return 2; } a=solve(l[x],dep+1); b=solve(r[x],dep+1); if (a==1&&b==2||a==1&&b==3||a==3&&b==2) ans+=1; if (a==3&&b==3){printf("-1\n");exit(0);} return a|b; } int main() { scanf("%d",&n); fo(i,1,n)scanf("%d%d",&l[i],&r[i]); dfs(1,0); if (maxx-minx>=2) { printf("-1\n"); return 0; } if (maxx==minx) { printf("0\n"); return 0; } solve(1,0); printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ 1149 CTSC2007 风玲Mobiles DFS
- 【bzoj1149】【ctsc2007】【风铃】【dp】
- BZOJ1149 [CTSC2007]风玲
- BZOJ1149:[CTSC/APIO2007]风铃——题解
- 【bzoj1149】 [CTSC2007]风玲Mobiles
- bzoj 1150: [CTSC2007]数据备份Backup
- [bzoj1150][堆][贪心][CTSC2007]数据备份Backup
- 【堆+贪心】BZOJ1150 [CTSC2007]数据备份Backup
- [贪心+堆] BZOJ1150: [CTSC2007]数据备份Backup
- 【CTSC2007】bzoj1150 数据备份
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
- BZOJ 1150: [CTSC2007]数据备份Backup
- 【BZOJ1150】[CTSC2007]数据备份Backup
- 【BZOJ 1150】[CTSC2007]数据备份Backup
- 【bzoj1150】[CTSC2007]数据备份Backup
- bzoj 1150: [CTSC2007]数据备份Backup 贪心&堆
- BZOJ1150(CTSC2007)[数据备份Backup]--贪心+链表+堆
- 【BZOJ】【P1150】【CTSC2007】【数据备份Backup】【题解】【堆or平衡树】
- 【贪心+堆+链表】BZOJ1150(CTSC2007)[数据备份Backup]题解
- bzoj1150: [CTSC2007]数据备份Backup