出题人说:正解离线按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. linux和unix的对照

    在之前的博客中说到,linux是一个单一内核的操作系统,但它与传统的单一内核UNIX操作系统不同. 在普通单一内核系统中,全部内核代码都是被静态编译和链接的. 而在linux中,能够动态的装入和卸载内 ...

  2. vue3事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. WITH common_table_expression (Transact-SQL)

    https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql Specifi ...

  4. Spring MVC -- UEditor 编辑器整合 上传图片至外部文件夹(非项目文件夹)

    上传图片到外部储存,回显图片 下载全部UEditor资源源码 config.json配置 config.json中添加如下属性 (一定要添加此属性): "physicsPath": ...

  5. epson 630打印机驱动安装不上

    1号机: 连接到630打印机的电脑 2号机: 通过网络连接到630打印机 *现状: 直接将数据线插在2号机上安装打印机时,驱动安装不上,设备管理器中有“!”号 *原因: 可能是已有一台通过网络连接到1 ...

  6. I want to do——输入流readline阻塞问题

    据悉,外界对程序员的印象不是木讷就是死板,不是最笨就是不爱说话,不是宅就是闷骚.昨天我们老左批评我说,自从你写了程序了,你以前的优点都退化了.放在去年,我还觉得我没什么啊,程序员就是这样啊,那是因为我 ...

  7. 昼猫笔记 -- 面向对象(II) - 继承

    继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...

  8. file---探测给定文件的类型

    file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 语法 file(选项)(参数) 选项 -b:列出辨识结果时,不显示文件名称: -c:详细显示 ...

  9. leetcode 数据库十题记录

    题目从难到易记录.解题过程中,如果不太熟悉,可以将题目中的表自己手动录入到自己的数据库中,就方便学习,测试. 185. Department Top Three Salaries 要求就是查询出每个部 ...

  10. QT就是别人好心帮你做一些枯燥,并且很重复的代码编写工作,让你更好的把精力投入到你界面的逻辑和功能的实现的功能库(否则写了上万行代码了,才写出个BUG一大堆的毛坯)

    好了,现在开始记录我学习QT的学习历程 . 本人也不是计算机专业出来的,自学了一点,但还是不好找工作,于是参加了培训,虽然感觉没多学到什么 编程的学习生涯就是不断的看别人的源码,然后自己参考着写写自己 ...