题面

根据树上距离的计算方法,可以先把答案化成$\sum dep_i+n*dep_u-\sum 2*dep[LCA(i,u)]$的形式,然后维护$\sum 2*dep[LCA(i,u)]$

把妖怪们按年龄排序,轻重剖分后插入每个点到根的路径,记录经过次数,询问也是往根跳然后每次统计边权*次数。

可持久化线段树+差分

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=1e7+,inf=1e9;
int root[N],son[M][],num[M];
int p[N],noww[N],goal[N],val[N];
int siz[N],far[N],imp[N],top[N],dfn[N];
long long dis[N],sum1[N],sum2[N],sum[M],ans;
int n,m,nm,rt,t1,t2,t3,rot,cnt,tot;
struct a
{
int age,idx;
}mon[N];
bool operator < (a x,a y)
{
return x.age==y.age?x.idx<y.idx:x.age<y.age;
}
void Link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v;
noww[++cnt]=p[t],p[t]=cnt;
goal[cnt]=f,val[cnt]=v;
}
void DFS(int nde,int fth)
{
int tmp=;
siz[nde]=,far[nde]=fth;
for(int i=p[nde],g;i;i=noww[i])
if((g=goal[i])!=fth)
{
dis[g]=dis[nde]+val[i];
DFS(g,nde),siz[nde]+=siz[g];
if(siz[g]>tmp) tmp=siz[g],imp[nde]=g;
}
}
void Mark(int nde,int tpp)
{
top[nde]=tpp,dfn[nde]=++tot;
sum1[tot]=dis[nde]-dis[far[nde]];
if(imp[nde])
{
Mark(imp[nde],tpp);
for(int i=p[nde],g;i;i=noww[i])
if((g=goal[i])!=far[nde]&&g!=imp[nde]) Mark(g,g);
}
} int Insert(int pre,int l,int r,int ll,int rr)
{
int nde=++tot;
son[nde][]=son[pre][];
son[nde][]=son[pre][];
num[nde]=num[pre],sum[nde]=sum[pre];
if(l==ll&&r==rr) num[nde]++;
else
{
int mid=(l+r)>>;
sum[nde]+=sum1[rr]-sum1[ll-];
if(mid>=rr) son[nde][]=Insert(son[pre][],l,mid,ll,rr);
else if(mid<ll) son[nde][]=Insert(son[pre][],mid+,r,ll,rr);
else son[nde][]=Insert(son[pre][],l,mid,ll,mid),
son[nde][]=Insert(son[pre][],mid+,r,mid+,rr);
}
return nde;
}
long long Query(int nde,int l,int r,int ll,int rr)
{
long long ret=(sum1[rr]-sum1[ll-])*num[nde];
if(l==ll&&r==rr)
return ret+sum[nde];
else
{
int mid=(l+r)>>;
if(mid>=rr) return ret+Query(son[nde][],l,mid,ll,rr);
else if(mid<ll) return ret+Query(son[nde][],mid+,r,ll,rr);
else return ret+Query(son[nde][],l,mid,ll,mid)+Query(son[nde][],mid+,r,mid+,rr);
}
} int Change(int nde)
{
while(top[nde]!=rt)
rot=Insert(rot,,n,dfn[top[nde]],dfn[nde]),nde=far[top[nde]];
return rot=Insert(rot,,n,,dfn[nde]);
}
long long Ask(int trt,int nde)
{
long long ret=;
while(top[nde]!=rt)
ret+=Query(trt,,n,dfn[top[nde]],dfn[nde]),nde=far[top[nde]];
return ret+Query(trt,,n,,dfn[nde]);
} int main()
{
scanf("%d%d%d",&n,&m,&nm),rt=;
for(int i=;i<=n;i++)
scanf("%d",&t1),mon[i]=(a){t1,i};
sort(mon+,mon++n);
for(int i=;i<n;i++)
scanf("%d%d%d",&t1,&t2,&t3),Link(t1,t2,t3);
DFS(,),Mark(,);
for(int i=;i<=n;i++)
sum1[i]+=sum1[i-],sum2[i]=sum2[i-]+dis[mon[i].idx];
for(int i=;i<=n;i++)
root[i]=Change(mon[i].idx);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
t2=(ans+t2)%nm,t3=(ans+t3)%nm;
if(t2>t3) swap(t2,t3);
int ll=lower_bound(mon+,mon++n,(a){t2,})-mon;
int rr=upper_bound(mon+,mon++n,(a){t3,inf})-mon-;
// printf("%d==%d==%d==%d==%d==",ll,rr,dis[t1]*(rr-ll+1),sum2[rr]-sum2[ll-1],2*(Ask(root[rr],t1)-Ask(root[ll-1],t1)));
printf("%lld\n",ans=dis[t1]*(rr-ll+)+sum2[rr]-sum2[ll-]-*(Ask(root[rr],t1)-Ask(root[ll-],t1)));
}
return ;
}

解题:HNOI 2015 开店的更多相关文章

  1. [HNOI 2015]开店

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

  2. [HNOI 2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  3. [HNOI 2015]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  4. [HNOI 2015]接水果

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black,  她觉得这个游戏太简单了,于是发明了一个更 ...

  5. [HNOI 2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  6. [HNOI 2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  7. 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...

  8. 「HNOI 2015」实验比较

    \(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...

  9. [BZOJ 4010][HNOI 2015] 菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 1776  Solved: 889[Submit][Status ...

随机推荐

  1. excel实用技巧——vlookup函数

    1.VLOOKUP函数的套路 VLOOKUP(要找谁,在哪儿找,返回第几列的内容,精确找还是近似找) 最后一个参数: 如果为0或FASLE,用精确匹配方式,而且支持无序查找: 如果为TRUE或被省略, ...

  2. 四、MYSQL的数据类型

    类型选择原则 1.储存空间越少越好: 2.简单就好:例如整型比字符串更简单: 3.尽量避免null: 一.整数类型 1.有tinyint(8位).SMALLINT(16位).MEDIUMINT(24位 ...

  3. [APIO2015]巴厘岛的雕塑[按位贪心+dp]

    题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...

  4. [CF1059E]Split the Tree[贪心+树上倍增]

    题意 给定 \(n\) 个节点的树,点有点权 \(w\) ,划分成多条儿子到祖先的链,要求每条链点数不超过 \(L\) ,和不超过 \(S\),求最少划分成几条链. \(n\leq 10^5\) . ...

  5. HDFS-异常大全-《每日五分钟搞定大数据》

    点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...

  6. 设计模式 笔记 策略模式 Strategy

    //---------------------------15/04/28---------------------------- //Strategy 策略模式----对象行为型模式 /* 1:意图 ...

  7. cbuild-一个创建和管理C++项目的工具

    cbuild-一个创建和管理C++项目的工具 介绍: 这是个人开发的一个管理C++项目的工具,用shell脚本编写. 可能会不定期更新,也欢迎大家一起完善. 当前开发版本0.5.各版本功能如下: ve ...

  8. nodejs 监控代码变动实现ftp上传

    被动模式下 //https://www.npmjs.com/package/watch //文件同步功能 var watch = require('watch'); var path = requir ...

  9. Alpha版本发布时间安排

    Alpha版本发布截止时间:2014年11月23日 第一轮迭代M1报告时间:2014年11月27日课上 - 每个团队5分钟时间汇报,5分钟时间提问 第一轮迭代M1事后分析报告时间:2014年11月29 ...

  10. Linux 第五周 实验: 分析system_call中断处理过程

    姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一个系统调用内核函数 ...