hdu5390 tree
先求出dfs序,然后建立线段树,线段树每个节点套一个set。
修改操作只需要改被子树区间完全覆盖的线段树节点,将其节点中set的原来的值删除,加入新值。
询问操作查询单点到根的所有节点上的set中与查询值异或起来最大的那个。
查询set中的数与x异或的最大值,可以从高位到低位枚举二进制位,根据x的二进制位,查询一些set中数值的存在情况,例如加入x的二进制第y位为1,那么如果set中存在第y位为0的数字,明显可以使得答案更大。下面代码中这段的代码类似于二分。
时间复杂度O(nlogn^3)
代码
#include<cstdio>
#include<set>
#include<algorithm>
#include<cstring>
#define N 500010
using namespace std;
int n,m,i,a,b,typ;
int dp,p[N],pre[N],tt[N];
int tot,L[N],R[N],l[N],r[N],v[N],stack[N],deep,flag;
multiset<int> Set[N];
void link(int x,int y)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
}
void dfs()
{
int i;
while (deep)
{
if (L[stack[deep]]==)
{
tot++;
L[stack[deep]]=tot;
}
if (p[stack[deep]])
{
i=p[stack[deep]];
deep++;stack[deep]=tt[i];
p[stack[deep-]]=pre[i];
}
else
{
R[stack[deep]]=tot;
deep--;
}
}
}
void build(int x,int a,int b)
{
int m;
l[x]=a;r[x]=b;
Set[x].clear();
Set[x].insert(-);
Set[x].insert(<<);
if (b-a>)
{
m=(a+b)>>;
build(*x,a,m);
build(*x+,m,b);
}
}
void change(int x,int a,int b,int c,int d)
{
if ((a<=l[x])&&(r[x]<=b))
{
Set[x].insert(d);
if (flag)
Set[x].erase(c);
return;
}
int m=(l[x]+r[x])>>;
if (a<m) change(*x,a,b,c,d);
if (m<b) change(*x+,a,b,c,d);
}
int Q(int x,int y)
{
int l,r,m,p,q;
if (Set[x].size()==) return ;
l=;r=(<<)-;
while (l!=r)
{
m=(l+r)>>;
multiset<int>::iterator it=Set[x].upper_bound(m);
p=*it;
q=*(--it);
if (p>r)
r=m;
else
if (q<l)
l=m+;
else
{
if ((l^y)>((m+)^y))
r=m;
else
l=m+;
}
}
return l^y;
}
int query(int x,int a,int b,int c)
{
int ans=Q(x,c);
if ((a<=l[x])&&(r[x]<=b))
return ans;
int m=(l[x]+r[x])>>;
if (a<m) ans=max(ans,query(*x,a,b,c));
if (m<b) ans=max(ans,query(*x+,a,b,c));
return ans;
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d%d",&n,&m);
dp=;
for (i=;i<=n;i++)
{
L[i]=;
p[i]=;
}
for (i=;i<=n;i++)
{
scanf("%d",&a);
link(a,i);
}
tot=;
deep=;stack[]=;
dfs(); build(,,n);
flag=;
for (i=;i<=n;i++)
{
scanf("%d",&v[i]);
change(,L[i]-,R[i],,v[i]);
}
flag=;
for (i=;i<=m;i++)
{
scanf("%d",&typ);
if (typ==)
{
scanf("%d%d",&a,&b);
change(,L[a]-,R[a],v[a],b);
v[a]=b;
}
else
{
scanf("%d",&a);
printf("%d\n",query(,L[a]-,L[a],v[a]));
}
}
}
}
hdu5390 tree的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
随机推荐
- Groovy 在eclipse中的使用
今天在写Groovy脚本的时候发现一个问题.如下图,element的elementIterator()方法不能智能显示,只能手动输入.而在eclipse中如果类a没有方法a,那么你是用"cl ...
- session和cookie区别
<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...
- 将对象转换成Dictionary 字典
/// <summary> /// /// 将对象属性转换为key-value对 /// </summary> /// <param name="o" ...
- Asp.net MVC23 使用Areas功能的常见错误
一般WEB项目都会不同的页面区域,如:用户前台.用户后台.管理员后台. 访问的URL: 用户前台:www.domain.com/home/index 用户后台:www.domain.com/admin ...
- 在定位中,如何清除已经设置好的bottom
这个东西其实很简单,将bottom设auto,便可在设置top的值,那么具体的应用是什么?目前一个是用于全屏,二是用于输入框在手机端的下半屏(被输入发遮挡问题)? 例子如下 css代码: * { ma ...
- iOS:集成环信EaseMobSDK单聊功能
当然在集成环信之前需要一些准备操作: 1.首先注册环信开发者账号,直接进入环信官网注册即可:http://www.easemob.com 2.按照文档一步一步将需要的文件全部拖入工程中:http:// ...
- Android HttpClient基本使用方法
GET 方式 //先将参数放入List,再对参数进行URL编码 List<BasicNameValuePair> params = new LinkedList<BasicNameV ...
- 建字段_添加数据_生成json.php
<?php header("Content-Type:text/html;charset=utf8"); class db{ static $localhost = &quo ...
- SQLServer找出执行慢的SQL语句
SELECT (total_elapsed_time / execution_count)/1000 N'平均时间ms' ,total_elapsed_time/1000 N'总花费时间ms' , ...
- Python模块 (xlsxwriter)
xlsxwriter是python中用来处理execl表格的库 参考