CodeForces 797D Broken BST
$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的更多相关文章
- Broken BST CodeForces - 797D
Broken BST CodeForces - 797D 题意:给定一棵任意的树,对树上所有结点的权值运行给定的算法(二叉查找树的查找算法)(treenode指根结点),问对于多少个权值这个算法会返回 ...
- AC日记——Broken BST codeforces 797d
D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...
- Codeforces 797 D. Broken BST
D. Broken BST http://codeforces.com/problemset/problem/797/D time limit per test 1 second memory lim ...
- CodeForces 24D Broken robot(期望+高斯消元)
CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...
- CodeForces 1251A --- Broken Keyboard
[CodeForces 1251A --- Broken Keyboard ] Description Recently Polycarp noticed that some of the butto ...
- 【codeforces 797D】Broken BST
[题目链接]:http://codeforces.com/contest/797/problem/D [题意] 给你一个二叉树; 然后问你,对于二叉树中每个节点的权值; 如果尝试用BST的方法去找; ...
- CodeForces 24D Broken robot (概率DP)
D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- CodeForces 24D Broken Robot
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000 一 ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
随机推荐
- gcc和MinGW的异同
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...
- uva 11722 Joining with Friend
https://vjudge.net/problem/UVA-11722 题意:你和朋友都要乘坐火车,并且都会途径A城市.你们很想会面,但是你们到达这个城市的准确时刻都无法确定.你会在时间区间[t1, ...
- KMP next表模板
void makeNext(const char P[],int next[]) { int q,k;//q:模版字符串下标:k:最大前后缀长度 int m = strlen(P);//模版字符串长度 ...
- 《JavaScript 实战》:JavaScript 实现拖拽缩放效果
拖拉缩放效果,实现通过鼠标拖动来调整层的面积(宽高)大小,例如选框效果.这里的拖拉缩放比一般的选框复杂一点,能设置八个方位(方向)的固定触发点,能设置最小范围,最大范围和比例缩放. 跟拖放效果一样,程 ...
- new Date('2014/04/30') 和 new Date('2014-04-30') 的区别
new Date('2014/04/30') Wed Apr 30 2014 00:00:00 GMT+0800 (中国标准时间) new Date('2014-04-30'); Wed Apr 30 ...
- 【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜
[算法]贪心扫描线(+堆) [题意]给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数. [题解] 参考:[bzoj1707]: [U ...
- 24、简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- 修改ecshop后台的管理菜单
ecshop后台菜单如何去修改,下面ecshop开发中心如何去修改 首先先打开后台菜单项相关文件: admin\includes\inc_menu.php languages\zh_cn\admin\ ...
- es6新语法Object.assign()
1.介绍 Object.assign用于对象的合并,将源对象的所有可枚举属性复制到目标对象,只拷贝源对象自身的属性继承属性补考呗 Object.assign(target,source1,...)第一 ...
- [MySQL] AUTO_INCREMENT lock Handing in InnoDB
MySQL AUTO_INCREMENT lock Handing in InnoDB 在MySQL的表设计中很普遍的使用自增长字段作为表主键, 实际生产中我们也是这样约束业务开发同学的, 其中的优势 ...