题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1149

水题。。。。。
直接BFS。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b) for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=; int N;
PII a[maxN+];
int maxdep,dep[maxN+];
int ans;
int head,tail,que[maxN+];
int cnt,val[*maxN+],sum[*maxN+]; int main()
{
freopen("bzoj1149.in","r",stdin);
freopen("bzoj1149.out","w",stdout);
int i;
N=gint();
dep[]=;
re(i,,N)
{
a[i].fi=gint(),a[i].se=gint();
if(a[i].fi!=-)dep[a[i].fi]=dep[i]+;
if(a[i].se!=-)dep[a[i].se]=dep[i]+;
}
ans=;
re(i,,N)upmax(maxdep,dep[i]);
re(i,,N)if(a[i].fi==- || a[i].se==-)if(maxdep-dep[i]>){ans=-;break;}
if(ans==-){cout<<ans<<endl;return ;}
que[head=tail=]=;
re(i,,maxdep-)
{
int temp=tail;
while(head<=temp)
{
int u=que[head++];
que[++tail]=a[u].fi;
que[++tail]=a[u].se;
}
}
re(i,head,tail)
{
int u=que[i];
val[++cnt]=(a[u].fi==-)?:;
val[++cnt]=(a[u].se==-)?:;
}
re(i,,N)sum[i]=sum[i-]+val[i];
int l=,r=cnt;
while(l<r)
{
int mid=(l+r)/;
int lf,rf;
if(sum[mid]-sum[l-]==mid-l+) lf=; else if(sum[mid]-sum[l-]==) lf=; else lf=;
if(sum[r]-sum[mid]==r-mid) rf=; else if(sum[r]-sum[mid]==) rf=; else rf=;
if(lf== && rf==) {ans=-;break;}
if(lf== && rf==) break;
if(lf== && rf==) {ans++;break;}
if(lf== && rf==) break;
if(lf== && rf==) break;
if(lf== && rf==) {ans++;l=mid+;continue;}
if(lf== && rf==) {l=mid+;continue;}
if(lf== && rf==) {r=mid;continue;}
if(lf== && rf==) {ans++;r=mid;continue;}
}
cout<<ans<<endl;
return ;
}

bzoj1149的更多相关文章

  1. BZOJ1149[CTSC2007]风玲Mobiles

    Description Input Output 输出仅包含一个整数.表示最少需要多少次交换能使风铃满足Ike的条件.如果不可能满足,输出-1. Sample Input 6 2 3 -1 4 5 6 ...

  2. BZOJ1149 [CTSC2007]风玲

    Description Input Output 输出仅包含一个整数.表示最少需要多少次交换能使风铃满足Ike的条件.如果不可能满足,输出-1. Sample Input 6 2 3 -1 4 5 6 ...

  3. BZOJ1149:[CTSC/APIO2007]风铃——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1149 https://www.luogu.org/problemnew/show/P3621 sb ...

  4. 【bzoj1149】 [CTSC2007]风玲Mobiles

    题目意为:给一颗二叉树,每一次操作可以交换该子树的左右两颗子树,要将该树变为完全二叉树,求最小操作次数.从根开始进行一遍DFS.记录每棵子树的大小size,如果左子树的size小于右子树的size那么 ...

随机推荐

  1. JS浏览器对象-window对象

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  2. Linux下那些奇葩的命令

    相信喜爱编程,痴迷技术的你,肯定接触过甚至深爱着linux,甚至可能已经很熟悉linux了,可是linux那逗比的一面,你又知道多少. 本文!纯粹娱乐!不喜勿喷! 1.程序猿的愤慨! yes 当我们再 ...

  3. Redis起步

    Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介  Redis是一个key-value存储系统.和Memcached类似,但是解决 ...

  4. IT English Collection(16) of Message

    1 前言 本文介绍了关于Objective-C中的消息机制,详情如下. 转载请注明出处:http://blog.csdn.net/developer_zhang 2 详述 2.1 原文 A messa ...

  5. android requestDisallowInterceptTouchEvent用途

    ViewPager来实现左右滑动切换tab.假设tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比方想滑动tab项中的可水平滑动的控件,却导致tab切换. 由于Android事件机制是从父 ...

  6. NSData的一些用法

    //NSData遵循NSCopying NSCoding协议,它提供面向对象的数组存储为字节 //适用与读写文件,而读写文件的时候需要一个缓冲区,而NSDate就提供了这么一个缓存区 //定义一个ch ...

  7. xml的加密和解密

    xml加密(XML Encryption)是w3c加密xml的标准.这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留. 介绍我们有3个 ...

  8. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  9. Win32<CreatFile>

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

  10. SQL转换函数to_char/to_date/to_number

    日期型->字符型转换函数to_char(d [,fmt]) 函数to_char(d [,fmt])用于将日期型数值转换为字符串(varchar2类型),其中参数d用于指定日期值,fmt用于指定要 ...