出题人说:正解离线按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. Nrf51822中设置128bit UUID service

    Nrf51822中设置128bit UUID service uint32_tble_dajia_add_service(ble_dajia_t *p_wechat) { uint32_t err_c ...

  2. hashCode 和 equals 方法

    hashCode 和 equals 方法 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. 使用hashCode()和 ...

  3. asp.net MVC4.0中几种控制器的区别

    空的MVC控制器MVC控制器的读/写操作和视图,使用实体框架MVC控制器带空的读/写操作空API控制器API控制器的读/写操作和视图,使用实体框架API控制器带空的读/写操作

  4. IntelliJ IDEA springmvc demo

    construction pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  5. useradd

    功能说明:useradd命令可用于创建新的用户或者更改用户的信息. 语法格式:useradd [选项] [用户名]useradd -D [选项] 选项说明:1.使用useradd常规添加用户工作原理流 ...

  6. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  7. 紫书 习题 10-16 UVa 1647 (高精度+递推)

    这道题我已经推出00和1过两步变成00了,可我没有继续做下去-- 后来看了博客发现自己已经做了90%了-- 可惜了,以后不要轻易放弃. 1的个数有个规律,就是每次都乘以2,因为0和1下一步都会变出1 ...

  8. https soap链接示例

    1.先安装soap扩展sudo yum install php-soap 2.安装openssL 3.function  issure($sn){//通过soap链接接口  进行确认是否是正确的sn码 ...

  9. 获取cpu使用率

    http://blog.csdn.net/u010515761/article/details/43225621 http://stackoverflow.com/questions/74674/ho ...

  10. Activity中recreate方法的应用

    參考两篇文章:http://blog.csdn.net/watermusicyes/article/details/47392949     http://blog.csdn.net/droyon/a ...