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[