传送门

(下面记年龄为\(a_x\))题目要求的是\[\sum_{x=1}^{n} [a_x\in [l,r]]*dis(x,u)=\sum_{x=1}^{n} [a_x\in [l,r]]*de_x+\sum_{x=1}^{n} [a_x\in [l,r]]*de_u-2*\sum_{x=1}^{n}[a_x\in [l,r]]*de_{lca(x,u)}\]

式子的前两项可以利用前缀和比较方便的计算,问题是那个lca的深度和,考虑两个点的lca深度就是两个点到根路径交集长度,所以可以依次把满足条件的对应点 到根路径上的每个点 加上到父亲的边权,然后查询就是从一个点到根的权值和,这个可以用树链剖分+线段树实现

然后考虑询问一个\(a_i\)的\([l,r]\)区间答案,可以看成询问\([1,r]\)减去\([1,l-1]\)所以可以套一个主席树,注意主席树要区间修改,要实现标记永久化

#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re registerusing namespace std;
const int N=150000+10,mod=1e9+7;
il int rd()
{int x=0,w=1;char ch=0;while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot=1;
LL w[N<<1];
il void add(int x,int y,int z)
{++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;++tot,to[tot]=x,nt[tot]=hd[y],w[tot]=z,hd[y]=tot;
}
int fa[N],fe[N],sz[N],hs[N],top[N],dfn[N],ti;
LL de[N],s1[N],s2[N],ans;
void dfs1(int x)
{sz[x]=1;for(int i=hd[x];i;i=nt[i]){int y=to[i];if(y==fa[x]) continue;fa[y]=x,fe[y]=i,de[y]=de[x]+w[i],dfs1(y),sz[x]+=sz[y];hs[x]=sz[hs[x]]>sz[y]?hs[x]:y;}
}
void dfs2(int x,int ntp)
{dfn[x]=++ti,s1[ti]=s1[ti-1]+w[fe[x]],top[x]=ntp;if(hs[x]) dfs2(hs[x],ntp);for(int i=hd[x];i;i=nt[i]){int y=to[i];if(y!=fa[x]&&y!=hs[x]) dfs2(y,y);}
}
int n,q,rt[N],tt,aa;
struct sd
{int a,i;bool operator < (const sd &bb) const {return a<bb.a;}
}mm[N];
struct node
{int ch[2];LL s,t;
}s[N*120];
#define mid ((l+r)>>1)
#define lc (s[o].ch[0])
#define rc (s[o].ch[1])
void bui(int &o,int l,int r)
{o=++tt;if(l==r) return;bui(lc,l,mid),bui(rc,mid+1,r);
}
void modif(int &o,int l,int r,int ll,int rr)
{s[++tt]=s[o],o=tt;if(l==ll&&r==rr) {++s[o].t;return;}s[o].s+=s1[rr]-s1[ll-1];if(ll<=mid) modif(lc,l,mid,ll,min(mid,rr));if(rr>mid) modif(rc,mid+1,r,max(mid+1,ll),rr);
}
LL quer(int o,int l,int r,int ll,int rr)
{if(!o) return 0;LL an=s[o].t*(s1[rr]-s1[ll-1]);if(l==ll&&r==rr) return an+s[o].s;if(ll<=mid) an+=quer(lc,l,mid,ll,min(mid,rr));if(rr>mid) an+=quer(rc,mid+1,r,max(mid+1,ll),rr);return an;
}
#undef midint main()
{n=rd(),q=rd(),aa=rd();bui(rt[0],1,n);for(int i=1;i<=n;++i) mm[i]=(sd){rd(),i};sort(mm+1,mm+n+1);for(int i=1;i<n;++i){int x=rd(),y=rd(),z=rd();add(x,y,z);}dfs1(1),dfs2(1,1);for(int i=1;i<=n;++i){s2[i]=s2[i-1]+de[mm[i].i];rt[i]=rt[i-1];int x=mm[i].i;while(x){modif(rt[i],1,n,dfn[top[x]],dfn[x]);x=fa[top[x]];}}while(q--){int x=rd(),ll=(rd()+ans)%aa,rr=(rd()+ans)%aa;if(ll>rr) swap(ll,rr);int l=1,r=n,z=0;while(l<=r){int mid=(l+r)>>1;if(mm[mid].a>=ll) z=mid,r=mid-1;else l=mid+1;}ll=z;l=1,r=n,z=n;while(l<=r){int mid=(l+r)>>1;if(mm[mid].a<=rr) z=mid,l=mid+1;else r=mid-1;}rr=z;ans=1ll*(rr-ll+1)*de[x]+s2[rr]-s2[ll-1];while(x){ans-=2*(quer(rt[rr],1,n,dfn[top[x]],dfn[x])-quer(rt[ll-1],1,n,dfn[top[x]],dfn[x]));x=fa[top[x]];}printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/10438455.html

luogu P3241 [HNOI2015]开店相关推荐

  1. 洛谷 P3241 [HNOI2015]开店 解题报告

    P3241 [HNOI2015]开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱. 这样的想法当然非 ...

  2. BZOJ4012 [HNOI2015]开店

    BZOJ4012 [HNOI2015]开店 这道题因为太多人拿这个题卡$BZOJ$,于是成了权限题... 本蒟蒻表示没钱氪金... 无奈,拿出了洛谷:P3241 [HNOI2015]开店 还有$LOJ ...

  3. [HNOI2015]开店

    [HNOI2015]开店 法一 一个点到所有点距离? 树上路径问题,从一个点出发的 虽然不是统计一次,虽然强制在线,点分治也可以做! 因为可以动态点分治的分治树来搞! vector维护到根路径dis, ...

  4. BZOJ 4012: [HNOI2015]开店 -- 动态树分治

    4012: [HNOI2015]开店 Time Limit: 70 Sec  Memory Limit: 512 MB Submit: 1463  Solved: 635 [Submit][Statu ...

  5. 4012: [HNOI2015]开店

    4012: [HNOI2015]开店 Time Limit: 70 Sec  Memory Limit: 512 MB Submit: 1241  Solved: 536 [Submit][Statu ...

  6. bzoj 4012: [HNOI2015]开店

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  7. bzoj 4012: [HNOI2015]开店 主席树

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  8. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  9. BZOJ4012 [HNOI2015]开店 (动态点分治)

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

最新文章

  1. string :操作总结
  2. Python与风水 的‘’南北通透‘’住宅与‘’南北” 向住宅的均价数据分析
  3. 制作镜像包时遇到的模块加载错误的问题
  4. java开发展望怎么写_Java开发趋势:2019年展望
  5. Android官方培训课程中文版(v0.9.5)
  6. 在Web服务器磁盘上缓存数据和HTML页面
  7. (九)nodejs循序渐进-Express框架(进阶篇)
  8. Python字符串模糊匹配库FuzzyWuzzy
  9. postgresql,pgadmin4安装后出错,界面只有文字
  10. Dapper的语法应用
  11. html5 火焰效果图,css3火焰文字特效
  12. application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...
  13. 生日快乐页面_宇智波佐助生日快乐!参与活动,豚豚为你送福利!
  14. docker使用阿里云仓库上传与下拉images
  15. 毕业设计-springboot+vue公租房租赁管理系统
  16. [渝粤教育] 深圳职业技术学院 安全教育与应急处理训练 参考 资料
  17. jvm内存模型(jdk1.8)
  18. 电脑开机密码,强制修改,覆盖原密码
  19. 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
  20. 统计素数并求和(20分)

热门文章

  1. linux shell实现go.mod迁移后版本号的更新问题(技能点:sed删除行自定义分隔符;文件的过滤后遍历)
  2. 【收藏】GeoMesa-HBase原理篇——写入过程
  3. redis中执行lua脚本命令
  4. 编译执行和解释执行/初识量子计算机
  5. 【软考-软件设计师】计算机系统知识概览
  6. Spring Bean的属性注入
  7. matlab的guide怎么添加函数,整理:matlab如何添加m_map工具箱
  8. azure虚拟机挂载数据盘
  9. 快速弄懂内存字节对齐
  10. ubuntu java 全屏显示_java 在ubuntu下实现全屏,上面的状态栏依然显示。如下图,不想要上面的状态栏...