出题人说:正解离线按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. Windows改动cmd字符集

    在中文Windows系统中,假设一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗体(所谓的DOS窗体)中不能正确显示文件里的内容.在默认情况下,命令行窗体中使用的代码页是中文或者美国的,即 ...

  2. 插入css样式表的三种方法

    http://www.w3school.com.cn/css/css_howto.asp http://www.runoob.com/css/css-howto.html 当读到一个样式表时,浏览器会 ...

  3. JavaWeb与JSP初识

    JavaWeb执行过程 目录结构 Web程序部署在Tomcat的/webapps下面. 一个webapps文件夹可以部署多个不同的Web应用,webapps/web1,webapps/web2. 如果 ...

  4. commons-fileupload 多文件上传

    第三方的文件上传工具类,例如这个东东:http://www.oschina.net/p/commons-fileupload,解析的方法无非就是这样: 1:在 controller 中先 HttpSe ...

  5. @Not - Empty-Null-Blank

    1 @NotEmpty :不能为null,且Size>0 2  @NotNull:不能为null,但可以为empty,没有Size的约束 3  @NotBlank:只用于String,不能为nu ...

  6. LINQ的基本语法包含如下的8个上下文关键字,这些关键字和具体的说明如下

    出于工作需要,准备把LINQ的相关知识梳理一遍,希望能填补下之前学习漏掉的或是没有注意的地方,也为未来减轻压力~ LINQ查询表达式的基本语法很容易掌握,它使用C#常见的语言构造,从外观上看,和我们常 ...

  7. jquery正则匹配URL地址

    JQuery代码: var regexp = /((http|ftp|https|file):\/\/([\w\-]+\.)+[\w\-]+(\/[\w\u4e00-\u9fa5\-\.\/?\@\% ...

  8. Swift学习笔记(8)--函数

    1.定义及调用 func sayHelloAgain(personName: String) -> String { return "Hello again, " + per ...

  9. python + eclipse + django + postgresql 开发网站(一)

    一.配置开发环境 1.安装Python 载地址下:http://www.python.org/getit/

  10. CSUOJ 1541 There is No Alternative

    There is No Alternative Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on Aiz ...