Broken BST CodeForces - 797D
题意:给定一棵任意的树,对树上所有结点的权值运行给定的算法(二叉查找树的查找算法)(treenode指根结点),问对于多少个权值这个算法会返回false。
方法:如果要求对于值x运行算法能访问到结点k,根据给定算法还有树,可以推出对于每个结点k的x的范围(即最小值,最大值)(某结点p左子树的结点的x全部小于p的权值,右子树的结点的x全部大于p的权值)(由于全部权值均为整数,即使只知道小于和大于也可以推出最小值、最大值)。
然而,对于某个结点p的权值q,如果q不能访问到p,但能访问到另一个权值为q的结点,那么也会返回true。也就是对于值q,只要某个权值为q的结点可以由值q访问到,那么答案就要加上权值为q的点的总和。
由于权值的范围有点大,输出的时候不能直接用数组标记权值q能否返回true,必须要用特殊的方法。
#include<cstdio>
#include<algorithm>
using namespace std;
struct X
{
int v;
bool nok;
bool operator<(const X& b) const
{
return v<b.v;
}
}p[];
int l[],r[],fa[];
int min1[],max1[];
int n,root,ans;
//bool ok[1000000010];
void dfs(int x,int ll)//ll表示左/右子树
{
/*if(p[fa[x]].nok)
p[x].nok=true;
else
{*/
min1[x]=min1[fa[x]];
max1[x]=max1[fa[x]];
if(ll==)
{
max1[x]=min(max1[x],p[fa[x]].v-);
if(min1[x]>p[x].v||max1[x]<p[x].v)
p[x].nok=true;
}
else
{
min1[x]=max(min1[x],p[fa[x]].v+);
if(min1[x]>p[x].v||max1[x]<p[x].v)
p[x].nok=true;
}
//}
if(l[x]) dfs(l[x],);
if(r[x]) dfs(r[x],);
}
int main()
{
int i,t;
bool boo;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d%d%d",&p[i].v,&l[i],&r[i]);
fa[l[i]]=fa[r[i]]=i;
}
for(i=;i<=n;i++)
if(fa[i]==)
{
root=i;
break;
}
min1[root]=-0x6f6f6f6f;
max1[root]=0x6f6f6f6f;
if(l[root]) dfs(l[root],);
if(r[root]) dfs(r[root],);
// for(i=1;i<=n;i++)
// if(!nok[i])
// ok[v[i]]=true;
// for(i=1;i<=n;i++)
// if(!ok[v[i]])
// ans++;//这样就是"直接用数组标记权值q能否返回true"但空间不够
sort(p+,p+n+);
for(i=;i<n;)
{
t=;
boo=false;
do
{
i++;
t++;
if(!p[i].nok)
boo=true;
}
while(p[i].v==p[i+].v);
if(boo==false)
ans+=t;
}
printf("%d",ans);
return ;
}
Broken BST CodeForces - 797D的更多相关文章
- 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 797D】Broken BST
[题目链接]:http://codeforces.com/contest/797/problem/D [题意] 给你一个二叉树; 然后问你,对于二叉树中每个节点的权值; 如果尝试用BST的方法去找; ...
- CodeForces 797D Broken BST
$dfs$,线段树. 通过观察可以发现,某位置要能被找到,和他到根这条路上的每个节点的权值存在密切的联系,且是父节点的左儿子还是右儿子也有联系. 可以从根开始$dfs$,边走边更新线段树,如果遍历左儿 ...
- D. Recovering BST Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
http://codeforces.com/contest/1025/problem/D 树 dp 优化 f[x][y][0]=f[x][z][1] & f[z+1][y][0] ( gcd( ...
- Broken robot CodeForces - 24D (概率DP)
You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...
- Recovering BST CodeForces - 1025D (区间dp, gcd)
大意: 给定$n$个数, 任意两个$gcd>1$的数间可以连边, 求是否能构造一棵BST. 数据范围比较大, 刚开始写的$O(n^3\omega(1e9))$竟然T了..优化到$O(n^3)$才 ...
- Alex and broken contest CodeForces - 877A
/* Name: Copyright: Author: Date: 2018/5/2 10:45:16 Description: 要求出现一个朋友的名字,仅一次 */ #include <ios ...
- Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...
随机推荐
- 继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView
public class VerticalSearchGridView extends LinearLayout implements View.OnClickListener { private i ...
- base64 hash sha
/*! * Crypto-JS v1.1.0 * http://code.google.com/p/crypto-js/ * Copyright (c) 2009, Jeff Mott. All ri ...
- redis的图形界面管理工具
大部分人都知道redis是一款用在缓存服务器上的软件,它与memcache类似,都可以存储海量的数据,用在大访问量的web网站.聊天记录存放等方面,但是又与memcache不同: 1.缓存数据可以持久 ...
- ES6 一些新特性的总结
一.箭头函数 ES6中新增了一个箭头函数 ()=>,箭头函数通俗点讲就是匿名函数.箭头函数还有不同点在于改变函数中this,和js中的.bind 的方法差不多,继承后指向的不是最新的函数, ...
- js 中继承的几种方式
继承的方式一共有三种: 一.原型继承 通过prototype 来实现继承. function Person(name,age) { this.name=name; this.age=age; } ...
- ap和路由器有什么区别 ap和路由器的区别介绍【图文】
现在能够摆脱网线限制能够自由方便上网的WiFi和无线网络也来越流行,很多酒店.饭店.宾馆.办公楼等地方都会提供无线网络.而能够提供无线网络的设备有很多,现在我们介绍的是无线ap和无线路由器.那么,ap ...
- 使用pt-query-digest进行日志分析
使用pt-query-digest sudo apt install percona-toolkit 也可以到官网 https://www.percona.com/downloads/percona- ...
- nyoj--86--找球号(一)(hash&&set&&二分)
找球号(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在某一国度里流行着一种游戏.游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=10 ...
- 「LuoguP3252」 [JLOI2012]树
Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...
- WIN7开机自动登录设置
WIN7开机自动登录设置 1 执行rundll32 netplwiz.dll,UsersRunDll 开始菜单中找到运行并单击运行:如下图1所示 ...