$dfs$,线段树。

通过观察可以发现,某位置要能被找到,和他到根这条路上的每个节点的权值存在密切的联系,且是父节点的左儿子还是右儿子也有联系。

可以从根开始$dfs$,边走边更新线段树,如果遍历左儿子,那么将$[1,val-1]$全部加$1$,否则将$[val+1,n]$全部加$1$,回溯的时候减$1$,判断某位置能否到达可以比较单点值与深度的关系。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std; int f[400010];
int s[400010];
int res; void pushDown(int rt)
{
if(f[rt]==0) return ;
s[2*rt] += f[rt];
s[2*rt+1] += f[rt];
f[2*rt] += f[rt];
f[2*rt+1] += f[rt];
f[rt] = 0;
return ;
} void pushUp(int rt)
{
s[rt] = s[2*rt] + s[2*rt+1];
} void update(int L,int R,int val,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
s[rt] += val;
f[rt] += val;
return ;
} int m = (l+r)/2;
pushDown(rt);
if(L<=m) update(L,R,val,l,m,2*rt);
if(R>m) update(L,R,val,m+1,r,2*rt+1);
pushUp(rt);
} void query(int pos,int l,int r,int rt)
{
if(l==r)
{
res = s[rt];
return;
} int m = (l+r)/2;
pushDown(rt);
if(pos<=m) query(pos,l,m,2*rt);
else query(pos,m+1,r,2*rt+1);
pushUp(rt); } int n;
struct X
{
int val;
int left,right;
}node[100010];
int root;
int b[100010],sz;
int ans; int get(int x)
{
int L = 0,R = sz-1; while(L<=R)
{
int mid = (L+R)/2;
if(b[mid]>x) R = mid-1;
else if(b[mid] == x) return mid+1;
else L = mid+1;
}
} int u[100010]; void dfs(int x,int y)
{
query(node[x].val,1,n,1);
if(res != y) {}
else u[node[x].val]=1; if(node[x].left!=-1)
{
if(node[x].val>1) update(1,node[x].val-1,1,1,n,1);
dfs(node[x].left,y+1);
if(node[x].val>1) update(1,node[x].val-1,-1,1,n,1);
} if(node[x].right!=-1)
{
if(node[x].val<n) update(node[x].val+1,n,1,1,n,1);
dfs(node[x].right,y+1);
if(node[x].val<n) update(node[x].val+1,n,-1,1,n,1);
} } int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&node[i].val,&node[i].left,&node[i].right); for(int i=1;i<=n;i++) b[sz++] = node[i].val;
sort(b,b+sz);
for(int i=1;i<=n;i++)
{
node[i].val = get(node[i].val);
u[node[i].val]=1;
} int sum=0;
for(int i=1;i<=n;i++) sum=sum+1; for(int i=1;i<=n;i++)
{
if(node[i].left!=-1) f[node[i].left] = 1;
if(node[i].right!=-1) f[node[i].right] = 1;
} for(int i=1;i<=n;i++)
{
if(f[i]) continue;
root = i; break;
} memset(f,0,sizeof f);
memset(u,0,sizeof u);
dfs(root,0);
for(int i=1;i<=n;i++) sum=sum-u[node[i].val]; printf("%d\n",sum); return 0;
}

CodeForces 797D Broken BST的更多相关文章

  1. Broken BST CodeForces - 797D

    Broken BST CodeForces - 797D 题意:给定一棵任意的树,对树上所有结点的权值运行给定的算法(二叉查找树的查找算法)(treenode指根结点),问对于多少个权值这个算法会返回 ...

  2. AC日记——Broken BST codeforces 797d

    D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...

  3. Codeforces 797 D. Broken BST

    D. Broken BST http://codeforces.com/problemset/problem/797/D time limit per test 1 second memory lim ...

  4. CodeForces 24D Broken robot(期望+高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...

  5. CodeForces 1251A --- Broken Keyboard

    [CodeForces 1251A --- Broken Keyboard ] Description Recently Polycarp noticed that some of the butto ...

  6. 【codeforces 797D】Broken BST

    [题目链接]:http://codeforces.com/contest/797/problem/D [题意] 给你一个二叉树; 然后问你,对于二叉树中每个节点的权值; 如果尝试用BST的方法去找; ...

  7. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  8. CodeForces 24D Broken Robot

    题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000 一 ...

  9. Codeforces.24D.Broken robot(期望DP 高斯消元)

    题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...

随机推荐

  1. 不管谁坐了CIO的位置 都必须了解的法则

    目前一些设立了CIO岗位的央企中,CIO也只做到了“IO”(信息官,Information Officer),而没有做到“C”(首席,Chief).老总们总在抱怨没有合适的人选:懂技术的不懂业务,懂业 ...

  2. 状压dp Gym - 100676G

    http://codeforces.com/gym/100676 题目大意: 给你n个科目,m个关系,例如A->B,表示要学习B科目,一定要把A科目学习掉.同理,如果还有C->B,那么,B ...

  3. gym100712 ACM Amman Collegiate Programming Contest

    非常水的手速赛,大部分题都是没有算法的.巨慢手速,老年思维.2个小时的时候看了下榜,和正常人差了3题(,最后还没写完跑去吃饭了.. A 水 Sort 比大小 /** @Date : 2017-09-0 ...

  4. Elasticsearch Java API 查询

    一.查询的时候,需要建立一个SearchRequestBuilder,这里面将给出对于哪一个index或者type进行查询,并且所有的设置都可以在这里面进行实现,例如模糊查询,范围查询,前缀查询等. ...

  5. python_继承.ziw

    2017年1月2日, 星期一 python_继承   null

  6. bootstrap模态框 内部input无法手动获取焦点

    //重写enforceFocus方法$(document).ready(function(){ $.fn.modal.Constructor.prototype.enforceFocus = func ...

  7. [数据库中间件]centos6.6下配置libzdb所产生的错误

    1.关于gmtime_r.timegm的隐藏声明错误,从系统的time.h中复制两个函数引用到libzdb自己定义的time.h,代码如下: extern struct tm *gmtime_r (c ...

  8. 【CODEVS】2800 送外卖

    [算法]最短路(floyd)+状态压缩型动态规划 [题解] 经典的TSP问题(货郎担问题):求最小权哈密顿回路(遍历全图点一次且仅一次).本题稍作改动,先说原TSP问题解法:状压DP. 状态用二进制表 ...

  9. 小程序制作中 一个奇怪的bug

    事情是这样的:原一个购物车 合并本地数据和服务器 数据方法如下 ,正常测试没有问题,当每次重新登录,会调用到这个方法,就会莫名其妙的卡主,debug 发现 a1.length =77731508 导致 ...

  10. python并发编程之Queue线程、进程、协程通信(五)

    单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...