出题人说:正解离线按DFS序排序线段维护区间和

但是对于树上每个点都有一个区间和一个值,两个点之间求1~m的区间和,这不就是用可持久化线段树吗。

只不过这个线段树需要区间修改,不过不需要标记下传,询问时加起来就好了。

对于每一个节点x,建一个1~m的线段树版本

询问时,先求出u和v的lca和lca的父亲flca

询问在{u+v}和{lca,flca}的差集中的区间和就好了

可持久化数据结构耗费的空间是巨大的^_^

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lnt;
struct pnt{
int hd;
int a;
int b;
int oul;
int fa;
int dp;
lnt w;
int root;
}p[];
struct ent{
int twd;
int lst;
}e[];
struct tree{
int l,r;
lnt val;
lnt laz;
};
struct Traos{
tree tr[];
int siz;
int ks;
lnt ansl;
void build(int l,int r,int &spc)
{
if(!spc)
spc=++siz;
if(l==r)
return ;
int md=(l+r)/;
build(l,md,tr[spc].l);
build(md+,r,tr[spc].r);
}
void updte(int &spc,int last,int ll,int rr,int l,int r,lnt v)
{
if(l>rr||r<ll)
return ;
spc=++siz;
tr[spc]=tr[last];
if(ll<=l&&rr>=r)
{
tr[spc].val+=(lnt)(r-l+)*v;
tr[spc].laz+=v;
return ;
}
tr[spc].val+=(lnt)(min(rr,r)-max(l,ll)+)*v;
int mid=(l+r)/;
updte(tr[spc].l,tr[last].l,ll,rr,l,mid,v);
updte(tr[spc].r,tr[last].r,ll,rr,mid+,r,v);
return ;
}
lnt sumls(int spc1,int spc2,int ll,int rr,int l,int r)
{
if(l>rr||ll>r)
return 0ll;
if(ll<=l&&rr>=r)
return (lnt)(tr[spc2].val-tr[spc1].val);
int mid=(l+r)/;
return (lnt)((lnt)(min(rr,r)-max(ll,l)+)*(tr[spc2].laz-tr[spc1].laz))+sumls(tr[spc1].l,tr[spc2].l,ll,rr,l,mid)+sumls(tr[spc1].r,tr[spc2].r,ll,rr,mid+,r); }
}T;
int cnt;
int ont;
int n,m,q;
int ola[][];
int rt[];
int lg[];
void ade(int f,int t)
{
cnt++;
e[cnt].lst=p[f].hd;
e[cnt].twd=t;
p[f].hd=cnt;
}
void dfs(int x,int f)
{
p[x].fa=f;
p[x].dp=p[f].dp+;
p[x].oul=++ont;
ola[][ont]=x;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(to!=f)
{
dfs(to,x);
ola[][++ont]=x;
}
}
}
int mxs(int a,int b)
{
return p[a].dp<p[b].dp?a:b;
}
void kls()
{
for(int i=;i<=;i++)
{
for(int j=;j+(<<i)-<=ont;j++)
{
ola[i][j]=mxs(ola[i-][j],ola[i-][j+(<<(i-))]);
}
}
}
int lca(int a,int b)
{
if(p[a].oul>p[b].oul)
swap(a,b);
int lgg=lg[p[b].oul-p[a].oul+];
return mxs(ola[lgg][p[a].oul],ola[lgg][p[b].oul-(<<lgg)+]);
}
void fdfs(int x,int f)
{
p[x].root=++T.ks;
T.updte(rt[p[x].root],rt[p[f].root],p[x].a,p[x].b,,m,p[x].w);
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(to-f)
{
fdfs(to,x);
}
}
}
int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=*n;i++)
{
lg[i]=lg[i/]+;
}
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ade(x,y);
ade(y,x);
}
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].w);
p[i].a=min(p[i].a,p[i].b);
p[i].b=max(p[i].a,p[i].b);
}
dfs(,);
kls();
T.build(,m,rt[]);
fdfs(,);
for(int i=;i<=q;i++)
{
int u,v,l,r;
scanf("%d%d%d%d",&u,&v,&l,&r);
l=min(l,r);
r=max(l,r);
int la=lca(u,v);
lnt ans=;
int fl=p[la].fa;
ans=T.sumls(rt[p[la].root],rt[p[u].root],l,r,,m);
ans+=T.sumls(rt[p[fl].root],rt[p[v].root],l,r,,m);
printf("%lld\n",ans);
}
return ;
}

2018-8-10 模拟赛T3(可持久化线段树)的更多相关文章

  1. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

    题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...

  2. 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径

    LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...

  3. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

  4. 【2018.06.26NOIP模拟】T3节目parade 【支配树】*

    [2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...

  5. 20181030NOIP模拟赛T3

    2017种树 2017共有N棵树从0到N-1标号.现要把这些树种在一条直线上,第i棵树的种植位置X[i]如下确定: X[0] = X[0] MOD L: X[i] = (X[i-1]*A+B) MOD ...

  6. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  7. JZOJ 4611. 【NOI2016模拟7.11】接水问题 (贪心+A*+可持久化线段树)

    Description: https://gmoj.net/senior/#main/show/4611 题解: 先把A从大到小排序,最小的由排序不等式显然. 考虑类似第k短路的A*的做法. 定义状态 ...

  8. [LOJ2310][APIO2017]斑斓之地——可持久化线段树

    题目链接: [APIO2017]斑斓之地 将不是河流的格子染成白色,是河流的格子染成黑色,那么连通块数就是白色格子数$-1*2$的联通白色格子数$-2*1$的联通白色格子数$+2*2$的联通白色格子数 ...

  9. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

随机推荐

  1. Cocos2d-x学习笔记(十四)CCAutoreleasePool具体解释

    原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38964637 前言 之前学了那么多的内容.差点儿全部的控件都要涉及内存 ...

  2. 优化时序之补全if else

    时序优化中重要的一项就是提高模块的最高工作频率,工作频率由关键路径决定,通常的提高工作频率的步骤是:利用时序分析工具找到关键路径,分析关键路径主要延迟是布线延迟还是逻辑延迟,然后轮番十八般武器,如果是 ...

  3. 深入理解Android(5)——从MediaScanner分析Android中的JNI

    前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...

  4. ES6学习笔记(九)Set和Map数据结构

    1.set 基本等于Java的Set集合类型,无序不可重复集,常被用来去重. 基本用法 const s = new Set();//通过Set()构造函数创建 [2, 3, 5, 4, 5, 2, 2 ...

  5. 便捷编程-Xcode常用第三方插件 (随时更新)

    Xcode工具插件 1.XAlign 让Xcode编辑器中的代码以多种方式瞬间对齐 地址:https://github.com/qfish/XAlign 2.VVDocumenter-Xcode 在X ...

  6. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  7. cocos2d-x 3.2 之 2048 —— 第一篇

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  8. OpenCASCADE中散乱Edge生成Wire

    OpenCASCADE中散乱Edge生成Wire eryar@163.com Abstract. In OpenCASCADE a wire can be built from any number ...

  9. eclipse部署maven web项目到tomcat服务器时,没有将lib、web.xml复制过去的解决办法

    我这几天在写项目的时候发现自己以前的项目能够访问,隔一段时间写的这个项目却不能够访问,没有发现代码的逻辑错,但是就是访问不了jsp页面,项目一发布就是出现404错误,后来发现原来是发布到tomcat上 ...

  10. HTTP/2 服务器推送(Server Push)教程(HTTP/2 协议的主要目的是提高网页性能,配置Nginx和Apache)

    HTTP/2 协议的主要目的是提高网页性能. 头信息(header)原来是直接传输文本,现在是压缩后传输.原来是同一个 TCP 连接里面,上一个回应(response)发送完了,服务器才能发送下一个, ...