摘要:
题意是个大坑。。。只要,保证有且只有一个人的入度是0,就yes。。 1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int maxn = 2005; 8 int ind[ maxn ]; 9 struct node{ 10 int u,next; 11 }edge[ maxn*2000 ]; 12 int cnt,head[ m 阅读全文
摘要:
先判断是否存在环。。然后dfs出每个人比几个人要求高。。 1 ///* 2 //拓扑 3 //*/ 4 #include<stdio.h> 5 #include<string.h> 6 const int maxn = 10105; 7 int ind[ maxn ],add[ maxn ],vis[ maxn ]; 8 struct node{ 9 int u,next;10 }edge[ maxn<<2 ];11 int cnt,head[ maxn ];12 void init(){13 cnt = 0;14 memset( add,0,sizeof( 阅读全文
摘要:
1 /* 2 用线段树不会写 3 4 dp 5 l[ i ]:表示左边>=h[i]的位置pos 6 */ 7 #include<stdio.h> 8 #include<algorithm> 9 using namespace std;10 typedef long long int64;11 const int maxn = 100005;12 int64 h[ maxn ],l[ maxn ],r[ maxn ];13 int main(){14 int n;15 while( scanf("%d",&n)==1 ){16 if( n 阅读全文
摘要:
树这个数据结构内容真的很多,上一节所讲的二叉堆,其实就是一颗二叉树,这次讲的左偏树(又叫“左翼堆”),也是树。二叉堆是个很不错的数据结构,因为它非常便于理解,而且仅仅用了一个数组,不会造成额外空间的浪费,但它有个缺点,那就是很难合并两个二叉堆,对于 “合并”,“拆分”这种操作,我觉得最方面的还是依靠指针,改变一下指针的值就可以实现,要是涉及到元素的移动,那就复杂一些了。左偏树跟二叉堆比起来,就是一棵真正意义上的树了,具有左右指针,所以空间开销上稍微大一点,但却带来了便于合并的便利。BTW:写了很多很多的程序之后,我发觉“空间换时间”始终是个应该考虑的编程方法。:)左偏左偏,给人感觉就是左子树的 阅读全文