您的位置:首页 > 其它

第十九周 7.4 --- 7.10

2016-07-04 13:22 183 查看
新的一周,惯例地加油>.<

7.4

leetcode 114 Flatten Binary Tree to Linked List

把一颗二叉树拉成一个链表,不能够使用额外的空间

不会捉,看的题解了

如果 一个节点,没有右子树的话,直接把左子树挪到右子树就可以了

如果 一个节点没有左子树的话,就不用管

如果 一个节点既有左子树,又有右子树,就把右子树放在左子树的前序遍历的最后一个节点的后面,这样就变成 第一种情况了,再把左子树接过去

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 2e5+10;
int n,a[maxn],b[maxn],mx[maxn][55],mn[maxn][55];

void RMQ_init(){
for(int i = 0;i < n;i++) mx[i][0] = a[i];
for(int i = 0;i < n;i++) mn[i][0] = b[i];
for(int j = 1;(1<<j) <= n;j++){
for(int i = 0;i + (1<<j) - 1 < n;i++){
mx[i][j] = max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
mn[i][j] = min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
}
}
}

int RMQ_mx(int L,int R){
int k = 0;
while((1<<(k+1)) <= R-L+1) k++;
return max(mx[L][k],mx[R-(1<<k)+1][k]);
}

int RMQ_mn(int L,int R){
int k = 0;
while((1<<(k+1)) <= R-L+1) k++;
return min(mn[L][k],mn[R-(1<<k)+1][k]);
}

void solve(){
RMQ_init();
LL res = 0LL;
int lb,ub,mid,c1,c2;
for(int i = 0;i < n;i++){
lb = i;ub = n;
for(int k = 1;k <= 100;k++){
mid = lb+(ub-lb)/2;
if(RMQ_mx(i,mid) >= RMQ_mn(i,mid)) ub = mid;
else lb = mid+1;
}
c1 = ub;
lb = i;ub = n;
for(int k = 1;k <= 100;k++){
mid = lb+(ub-lb)/2;
if(RMQ_mx(i,mid) > RMQ_mn(i,mid)) ub = mid;
else lb = mid+1;
}
c2 = ub;
res += 1LL*(c2-c1);
//printf("c1 = %d c2 = %d\n",c1,c2);
}
printf("%I64d\n",res);
}

int main(){
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++) scanf("%d",&a[i]);
for(int i = 0;i < n;i++) scanf("%d",&b[i]);
solve();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: