出题人说:正解离线按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. 泛泰A820L (高通MSM8660 cpu) 3.4内核的CM10.1(Android 4.2.2) 測试版第二版

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  2. 79.express里面的app.configure作用

    以下摘自 express 3.0 的 文档 app.configure([env], callback) Conditionally invoke callback when env matches ...

  3. Spring MVC -- UEditor 编辑器整合入门

    仅作为入门测试...... 下载UEditor资源 使用maven项目 <!-- 上传文件的支持 --> <dependency> <groupId>commons ...

  4. JWT Authentication Tutorial: An example using Spring Boot--转

    原文地址:http://www.svlada.com/jwt-token-authentication-with-spring-boot/ Table of contents: Introductio ...

  5. Python(六) Python 函数

    一.认识函数 help(方法名字)  help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...

  6. Vue总结(一)

    vue总结 构建用户界面的渐进式框架 渐进式:用到什么功能即可使用转么的框架子模块. 两个核心点 向应的数据绑定 当时图发生改变->自动跟新视图,利用Object.defindProperty中 ...

  7. appid、appkey、appsecret、accesstoken,消息模板

    app_id, app_key, app_secret , 对于平台来说, 需要给你的 你的开发者账号分配对应的权限:1. app_id 是用来标记你的开发者账号的, 是你的用户id, 这个id 在数 ...

  8. VUE里子组件获取父组件动态变化的值

    在VUE里父组件给子组件间使用props方式传递数据,但是希望父组件的一个状态值改变然后子组件也能监听到这个数据的改变来更新子组件的状态. 场景:子组件通过props获取父组件传过来的数据,子组件存在 ...

  9. MYSQL去重复并计算总数的sql语句

    SELECT count(distinct uid) FROM `two_users`

  10. Hbuilder开发app实战-识岁06-face++的js实现【完结】

    前言 因为识岁app比較简单.所以这节就完结吧, 当然另一些能够优化完好的地方,可是个人兴趣不是非常大, 有想继续完好的,源代码在这里:https://github.com/uikoo9/shisui ...