codeforces COMPFEST-13 I. Illusions of the Desert 树剖

2023-10-31 09:50

本文主要是介绍codeforces COMPFEST-13 I. Illusions of the Desert 树剖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

I. Illusions of the Desert

(rating: 2300)
在这里插入图片描述

链接

https://codeforces.com/contest/1575/problem/I

题意

给一棵n个节点的树,点权为ai
要求对链做区间查询,单点修改。查的是边权和,边权的定义为: wab = max(|ax+ay|,|ax−ay|)。

input

6 4
10 -9 2 -1 4 -6
1 5
5 4
5 6
6 2
6 3
2 1 2
1 1 -3
2 1 2
2 3 3

output

39
32
0

在这里插入图片描述

思路

观察发现: max(|ax+ay|,|ax−ay|) = |ax| + |ay| , 然后就是树链剖分的事儿了。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+100;
struct E{int to;int nxt;
}e[N<<1];
int head[N],tot;
void add_edge(int u,int v){e[++tot].to = v;e[tot].nxt = head[u];head[u] = tot;
}
int a[N];
int n,q;
int mson[N],siz[N],fa[N],deep[N];
void dfs1(int u,int f){int MAX_SON = 0;fa[u] = f;siz[u] = 1;deep[u] = deep[f]+1;for(int i=head[u];i;i=e[i].nxt){int v = e[i].to;if(v==f) continue;dfs1(v,u);siz[u] += siz[v];if(siz[v]>MAX_SON){MAX_SON = siz[v];mson[u] = v;}}
}
int dfn[N],idx,top[N],w[N],tr[N<<2];
void dfs2(int u,int t){dfn[u] = ++idx;top[u] = t;w[idx] = a[u];if(!mson[u]) return;dfs2(mson[u],t);for(int i=head[u];i;i=e[i].nxt){int v = e[i].to;if(v==fa[u]||v==mson[u]) continue;dfs2(v,v);}
}
void build(int now,int l,int r){if(l==r){tr[now] = w[l];return;}int mid = (l+r)>>1;build(now*2,l,mid);build(now*2+1,mid+1,r);tr[now] = tr[now*2]+tr[now*2+1];
}
void update(int now,int l,int r,int loc,int x){if(l==r){tr[now] = x;return;}int mid = (l+r)>>1;if(loc<=mid)update(now*2,l,mid,loc,x);elseupdate(now*2+1,mid+1,r,loc,x);tr[now] = tr[now*2]+tr[now*2+1];
}
int query(int now,int l,int r,int ql,int qr){int sum = 0;if(l>=ql&&r<=qr){sum += tr[now];return sum;}int mid = (l+r)>>1;if(ql<=mid)sum += query(now*2,l,mid,ql,qr);if(qr>mid)sum += query(now*2+1,mid+1,r,ql,qr);return sum;
}
int qchain(int x,int y){int ans = 0;while (top[x]!=top[y]){if(deep[top[x]]<deep[top[y]]) swap(x,y);ans += query(1,1,n,dfn[top[x]],dfn[x]);x = fa[top[x]];}if(deep[x]>deep[y]){swap(x,y);}ans += query(1,1,n,dfn[x],dfn[y]);return ans;
}
signed main(){ios::sync_with_stdio(false);cin>>n>>q;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]<0) a[i] = -a[i];}for(int i=1;i<n;i++){int x,y;cin>>x>>y;add_edge(x,y);add_edge(y,x);}dfs1(1,0);dfs2(1,0);build(1,1,n);while(q--){int opt;cin>>opt;if(opt==1){int x,y;cin>>x>>y;x = dfn[x];update(1,1,n,x,abs(y));}else{int x,y;cin>>x>>y;cout<<2* qchain(x,y)- qchain(x,x)- qchain(y,y)<<endl;}}return 0;
}

这篇关于codeforces COMPFEST-13 I. Illusions of the Desert 树剖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314494

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

13 transition数组的动画使用

划重点 动画:transitiontransition-group :数组动画数组的 添加 / 删除 豆腐粉丝汤 清淡又健康 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><me

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成,软件打开效果一、VMware安装Windows11虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机5️⃣:解决连不上网问题 安装完成!!! Win11安装完成,软件打开效果 一、VMware安装Windows11虚拟机 首先确保自己的mac开启了网络共享。不然虚拟机连不上👀的 1️⃣:准备镜像