首页 > 其他分享 >【线段树】 HDOJ 5274 Dylans loves tree

【线段树】 HDOJ 5274 Dylans loves tree

时间:2023-07-05 20:33:22浏览次数:44  
标签:5274 Dylans int res LL anc tree include define


用dfs序构建线段树,然后用lca求出两点间路径的xor和。。。


#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 100005 
#define maxm 200005
#define eps 1e-7
#define mod 998244353
#define INF 0x3f3f3f3f
#define PI (acos(-1.0))
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid 
#define rson o<<1 | 1, mid+1, R
#define pii pair<int, int>
#pragma comment(linker, "/STACK:16777216")
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;
LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;}
LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}
// head

struct Edge
{
	int v;
	Edge *next;
}*H[maxn], *edges, E[maxm];

int anc[maxn][20];
int dep[maxn];
int in[maxn];
int out[maxn];
int a[maxn];
int sum[maxn << 4];
int lazy[maxn << 4];
const int M = 20;
int dfs_clock, n, m;

void addedges(int u, int v)
{
	edges->v = v;
	edges->next = H[u];
	H[u] = edges++;
}

void dfs(int u, int fa)
{
	dfs_clock++;
	in[u] = dfs_clock;
	anc[u][0] = fa;
	for(Edge *e = H[u]; e; e = e->next) if(e->v != fa) {
		int v = e->v;
		dep[v] = dep[u] + 1;
		dfs(v, u);
	}
	out[u] = dfs_clock;
}

int to(int u, int d)
{
	for(int i = M - 1; i >= 0; i--) if(dep[anc[u][i]] >= d) u = anc[u][i];
	return u;
}

int lca(int u, int v)
{
	if(dep[u] < dep[v]) swap(u, v);
	u = to(u, dep[v]);
	for(int i = M - 1; i >= 0; i--) if(anc[u][i] != anc[v][i]) u = anc[u][i], v = anc[v][i];
	return u == v ? u : anc[u][0];
}

void init()
{
	dfs_clock = 0;
	dfs(1, 1);
	for(int i = 1; i < M; i++)
		for(int j = 1; j <= n; j++)
			anc[j][i] = anc[anc[j][i-1]][i-1];
}

void pushup(int o)
{
	sum[o] = sum[ls] ^ sum[rs];
}

void pushdown(int o)
{
	if(lazy[o]) {
		sum[ls] ^= lazy[o];
		sum[rs] ^= lazy[o];
		lazy[ls] ^= lazy[o];
		lazy[rs] ^= lazy[o];
		lazy[o] = 0;
	}
}

void build(int o, int L, int R)
{
	lazy[o] = sum[o] = 0;
	if(L == R) return;
	int mid = (L + R) >> 1;
	build(lson);
	build(rson);
	pushup(o);
}

void update(int o, int L, int R, int ql, int qr, int v)
{
	if(ql <= L && qr >= R) {
		lazy[o] ^= v;
		sum[o] ^= v;
		return;
	}
	pushdown(o);
	int mid = (L + R) >> 1;
	if(ql <= mid) update(lson, ql, qr, v);
	if(qr > mid) update(rson, ql, qr, v);
	pushup(o);
}

int query(int o, int L, int R, int q)
{
	if(L == R) return sum[o];
	pushdown(o);
	int ans = 0, mid = (L + R) >> 1;
	if(q <= mid) ans = query(lson, q);
	else ans = query(rson, q);
	pushup(o);
	return ans;
}

void work()
{
	int u, v;
	scanf("%d%d", &n, &m);
	edges = E;
	memset(H, 0, sizeof H);
	for(int i = 1; i < n; i++) {
		scanf("%d%d", &u, &v);
		addedges(u, v);
		addedges(v, u);
	}
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]), a[i]++;
	init();
	build(1, 1, n);
	for(int i = 1; i <= n; i++) update(1, 1, n, in[i], out[i], a[i]);

	while(m--) {
		int kk;
		scanf("%d%d%d", &kk, &u, &v);
		if(kk) {
			int c = lca(u, v);
			int ans = query(1, 1, n, in[u]) ^ query(1, 1, n, in[v]) ^ a[c];
			if(ans) printf("%d\n", ans-1);
			else printf("-1\n");
		}
		else {
			++v;
			update(1, 1, n, in[u], out[u], a[u] ^ v);
			a[u] = v;
		}
	}
}

int main()
{
	int _;
	scanf("%d", &_);
	while(_--) work();
	
	return 0;
}




标签:5274,Dylans,int,res,LL,anc,tree,include,define
From: https://blog.51cto.com/u_8692734/6634970

相关文章

  • 【并查集】 HDOJ 4786 Fibonacci Tree
    就是求出搞成最小生成树的最少白边和最多白边的数量。。。。#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cstdio>#include<algorithm>#include<cstring>#include<......
  • vue-treeselect 被 overflow 遮挡
    场景在一个内容区域设置了overflow纵向滚动的对话框中,内部的vue-treeselect组件下拉框选项被遮挡了。解决办法给vue-treeselect设置appendToBody和z-index属性。注意事项设置了appendToBody后,下拉框选项的字号会变大。为了与原来的字号相匹配,需要修改样式。找......
  • 时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片
    什么是时序数据库先来介绍什么是时序数据。时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。时序数据库就是存放时序数据的数据库,并且需要支持时序......
  • el-tree树点击全选按钮,全部展开并且全选
    先看图:代码如下://全部选中qxClick(){this.isQx=!this.isQx;//判断按钮的状态this.expandAll();if(this.isQx){console.log(this.isQx,"-------------------------------",this.datas);//设置this.$r......
  • Git神器| SourceTree安装使用教程
    SourceTree是Windows和MacOSX下免费的Git客户端管理工具。支持创建、克隆、提交、push、pull和合并等操作。一、sourcetree的安装1.下载sourcetree下载链接:Sourcetree|FreeGitGUIfor MacandWindows2.安装sourcetree点击安装,第一个创建Bitbucket账户可跳过初......
  • tree-test
    #include<iostream>#include<stack>usingnamespacestd;typedefstructBiTNode{ chardata; structBiTNode*lchild; structBiTNode*rchild;}BiTNode,*BiTree;voidCreateTree(BiTree*Tree){ charch; ch=getchar(); if(ch=='.')......
  • [atAGC062E]Overlap Binary Tree
    记\(m=\frac{n+1}{2}\),即二叉树的叶子个数对于合法序列,按以下方式生成其对应的二叉树:(此处二叉树指无标号、以一个点为根且每个非叶节点恰有两个儿子的树)恰存在一个区间与其余区间均有交,将其作为根并(在序列中)删除恰存在一个\(i\in[1,n)\)使得\(\max_{1\lej\lei}R_{j}<L_{i+......
  • DistanceQueriesonaTree
    [ABC294G]DistanceQueriesonaTree首先树剖+线段树肯定可以直接用树剖模板过掉,但是带两个\(\log\)。我们考虑更优秀的做法。拟定\(1\)为根,首先维护前缀\(dis[i]\)为从\(1\simi\)的路径上的所有边权之和(这里记边权为在下面的点的点权)。显然,没有修改时答案是\(dis_a......
  • el-tree 实现懒加载
    为了解决数据量过大而导致的web页面卡死,我们采用懒加载的方式进行实现,1.首先,根据文档,我们在<el-tree>中加入 lazy和  :load="loadNode"如下图:2.在methods中写一下这个方法,如下图 说明一下,上图中的node.level===0时,我们在里面请求根节点的树结构,如下图:  ......
  • SourceTree使用cherry-pick
    热烈欢迎,请直接点击!!!进入博主AppStore主页,下载使用各个作品!!!注:博主将坚持每月上线一个新app!!【cherry-pick功能】:指从一个分支中选择一个或多个提交记录,并将它们应用到当前分支。使用cherry-pick功能的方法如下:1、在Sourcetree中打开要应用cherry-pick的分支。2、在提......