[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=5338

[算法]

首先对这棵树进行树链剖分

那么我们就将一个树上的问题转化为一个序列上的问题

建立可持久化字典树维护最大异或值即可

时间复杂度 : O(NlogN ^ 2)

[代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int N = 2e5 + ;
const int MAXLOG = ; struct edge
{
int to , nxt;
} e[N << ]; int n , tot , timer , q;
int head[N] , size[N] , top[N] , a[N] , perm[N] , l[N] , r[N] , son[N] , father[N] , depth[N] , rt[N]; struct Presitent_Trie
{
int sz;
int child[N * MAXLOG][] , latest[N * MAXLOG];
Presitent_Trie()
{
sz = ;
}
inline void modify(int bit , int &now , int old , int x , int loc)
{
now = ++sz;
child[now][] = child[old][] , child[now][] = child[old][];
latest[now] = loc;
if (bit < ) return;
int value = ;
if (x & ( << bit)) value = ;
modify(bit - , child[now][value] , child[old][value] , x , loc);
}
inline int query(int bit , int now , int lft , int x)
{
if (bit < )
return ;
int value = ;
if (x & ( << bit)) value = ;
if (latest[child[now][value]] >= lft) return ( << bit) + query(bit - , child[now][value] , lft , x);
else return query(bit - , child[now][value ^ ] , lft , x);
}
} PT; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u , int v)
{
++tot;
e[tot] = (edge){v , head[u]};
head[u] = tot;
}
inline void dfs1(int u , int par)
{
size[u] = ;
depth[u] = depth[par] + ;
father[u] = par;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == par) continue;
dfs1(v , u);
size[u] += size[v];
if (size[v] > size[son[u]]) son[u] = v;
}
}
inline void dfs2(int u , int t)
{
top[u] = t;
l[u] = ++timer;
if (son[u]) dfs2(son[u] , t);
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == father[u] || v == son[u]) continue;
dfs2(v , v);
}
r[u] = timer;
}
inline bool cmp(int x , int y)
{
return l[x] < l[y];
}
inline int query(int x , int y , int z)
{
int ans = ;
while (top[x] != top[y])
{
if (depth[top[x]] > depth[top[y]]) swap(x , y);
chkmax(ans , PT.query(MAXLOG - , rt[l[y]] , l[top[y]] , z));
y = father[top[y]];
}
if (depth[x] > depth[y]) swap(x , y);
chkmax(ans , PT.query(MAXLOG - , rt[l[y]] , l[x] , z));
return ans;
} int main()
{ read(n); read(q);
for (int i = ; i <= n; ++i) read(a[i]);
for (int i = ; i < n; ++i)
{
int x , y;
read(x); read(y);
addedge(x , y);
addedge(y , x);
}
dfs1( , );
dfs2( , );
for (int i = ; i <= n; ++i) perm[i] = i;
sort(perm + , perm + n + , cmp);
for (int i = ; i <= n; ++i) PT.modify(MAXLOG - , rt[i] , rt[i - ] , a[perm[i]] , i);
while (q--)
{
int type;
read(type);
if (type == )
{
int x , y;
read(x); read(y);
printf("%d\n" , PT.query(MAXLOG - , rt[r[x]] , l[x] , y));
} else
{
int x , y , z;
read(x); read(y); read(z);
printf("%d\n" , query(x , y , z));
}
} return ; }

[TJOI 2018] XOR的更多相关文章

  1. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  2. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

  3. [TJOI 2018]智力竞赛

    Description 题库链接 给出一张 \(m\) 个点的有向图.问可重最小路径覆盖是否 \(\leq n+1\) .若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值. \( ...

  4. 【TJOI 2018】数学计算

    [题目链接] 点击打开链接 [算法] 线段树维护区间乘积 [代码] #include<bits/stdc++.h> using namespace std; #define MAXQ 10 ...

  5. [TJOI 2018]游园会

    题意:求NOI的合法串... 思路: 首先这个似乎和后缀自动机没关系(话说TJ不考后缀自动机??),其实就是一个\(DP\)套\(DP\),考虑如果不看兑奖串就是一个LCS,当出现时多记一维即可. # ...

  6. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries

    地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...

  7. 2018.08.22 hyc的xor/mex(线段树/01trie)

    hyc的xor/mex 描述 NOIP2017就要来了,备战太累,不如做做hyc的新题? 找回自信吧! 一句话题意:n个数,m个操作 操作具体来讲分两步 1.读入x,把n个数全部xor上x 2.询问当 ...

  8. 【线性基】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem A. XOR

    题意:给你一些数,问你是否能够将它们划分成两个集合,使得这两个集合的异或和之差的绝对值最小. 设所有数的异或和为S,集合A的异或和为A. 首先,S的0的位对答案不造成影响. S的最高位1,所对应的A的 ...

  9. The 2018 ACM-ICPC Asia Qingdao Regional Contest K XOR Clique

    K XOR Clique BaoBao has a sequence a​1​​,a​2​​,...,a​n​​. He would like to find a subset S of {1,2,. ...

随机推荐

  1. CMake - boost - 可运行程序 - 静态库

    CMake - boost 最后更新日期:2014-04-25by kagula 阅读前提:<CMake入门(二)>.Linux的基本操作 环境: Windows 8.1 64bit英文版 ...

  2. js逻辑非同时两次使用 !!null

    今天遇到了“!!null”的写法,百度没有找到直接的解释,翻书在<javascript高级设计>P44找到了相应的解释: 同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数 ...

  3. 【iOS】UIWebView的HTML5扩展之canvas篇

    先前公布大那个所谓的"HTML5"扩展严格说来还算不是"HTML5".曲曲几行JS代码就自诩为HTML5扩展多少有些标题党的嫌疑. 而相比之下,本篇的主题can ...

  4. Windows App开发之集合控件与数据绑定

    为ListView和GridView加入数据 ListView採用垂直堆叠得方式显示数据.而GridView则採用水平堆叠得方式. 长相的话嘛,它们都几乎相同. <Grid Name=" ...

  5. Python编写的ARP扫描工具

    源码如下: rom scapy.all import * import threading import argparse import logging import re logging.getLo ...

  6. Jenkins + Maven + TestNG参数化调用测试用例

      希望实现的场景:Jenkins中的Job可针对不同浏览器,不同环境,运行不同的测试用例集,但测试用例只保持一份. 具体实现的思路:在运行Jenkins Job时传入参数,运行 mvn test 命 ...

  7. 网络协议分析之wireshark---抓包使用

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  8. 在zend framework框架中try{}catch(Exception e){}的跳转问题

    请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 首先我先说明我遇到的问题 try{ //导入学生信息 $ModelStudent->insert($dat ...

  9. WPF自定义Popup和弹出菜单

    Popup: <StackPanel Grid.Column="0" Grid.Row="6" Orientation="Horizontal& ...

  10. EasyPlayer开源流媒体移动端播放器推出RTSP-RTMP-HTTP-HLS全功能Pro版

    EasyPlayerPro介绍 Android EasyPlayerPro专业版全功能播放器,是由EasyDarwin开源团队维护的一款支持RTSP.RTMP.HTTP.HLS多种流媒体协议的播放器版 ...