2019ccpc女生专场 D - Tree

这是一道关于树剖的算法题目,要求处理树上的路径点权和查询操作,其中涉及到对路径上点的值进行平方根向下取整。由于数值范围限制,可以通过维护一个布尔变量来判断区间内所有点的权值是否全为1,以此简化问题。
摘要由CSDN通过智能技术生成

http://acm.hdu.edu.cn/showproblem.php?pid=6547
题意:给定一棵树,有两种操作,路径点权和查询,路径上每个点开根号向下取整。
思路:明显是树剖的操作,但是这个开根号没办法维护,线段树部分复杂度爆炸。但是实际上,每个值都在1e9之内,开根号不到10次就到1了,那么,我们只需要开一个bool变量维护一段区间是不是全都是1就可以了。

#include<bits/stdc++.h>
using namespace std;
#define maxn (100000+100)
#define ll long long

int n,m,root=1,dfs_clock,op;
vector<int> G[maxn];
int fa[maxn],son[maxn],sz[maxn],deep[maxn],id[maxn],id2[maxn],top[maxn];
ll w[maxn],ver_w[maxn];

int ql,qr;
ll sumv[maxn*4],all_one[maxn*4];
ll _sum;

ll build(int o,int l,int r)
{
   
    int mid=(l+r)/2;
    if(l==r)return sumv[o]=w[l];
    return sumv[o]=build(o*2,l,mid)+build(o*2+1,mid+1,r);
}

void maintain(int o,int l,int r)
{
   
    if(l==r)
	{
   
		sumv[o]=w[l];
		all_one[o]=(w[l]==1);
	}
    else
	{
   
		sumv[o]=sumv[o*2]+sumv[o*2+1];
		all_one[o]=(all_one[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值