解题:HNOI 2015 开店
根据树上距离的计算方法,可以先把答案化成$\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 开店的更多相关文章
- [HNOI 2015]开店
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- [HNOI 2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- [HNOI 2015]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- [HNOI 2015]接水果
Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 ...
- [HNOI 2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...
- [HNOI 2015]落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...
- 「HNOI 2015」实验比较
\(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...
- [BZOJ 4010][HNOI 2015] 菜肴制作
4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1776 Solved: 889[Submit][Status ...
随机推荐
- 【spring】spirng中的常用工具类
一.概述 很多时候,很多工具类其实spring中就已经提供,常用的工具类有: 参考:https://www.cnblogs.com/langtianya/p/3875103.html 内置的resou ...
- #20155232《网络对抗》Exp9 Web安全基础
20155232<网络对抗>Exp9 Web安全基础 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 WebGoat Webgoat是OWASP组织研 ...
- 20155235 《网络攻防》 实验九 Web安全基础
20155235 <网络攻防> 实验九 Web安全基础 实验内容 SQL注入攻击 XSS攻击 CSRF攻击 WebGoat WebGoat是OWASP组织研制出的用于进行web漏洞实验的应 ...
- jsp页面中日期的格式化
在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...
- POJ 3041&&3020
两道二分图的练手题. 3041:题意大概是在一个N*N的图上有K个东西,你每次可以清除一行或一列上的所有东西.让你求最少的操作次数. 我们根据题意建图.对于每一个点的坐标(x,y)之间连一条边.比如样 ...
- Shell基础入门
目录 Shell基础入门 1.什么是Shell? 2.Shell脚本的结构 3.Shell的变量 3.1.自定义环境变量 3.2.普通变量 3.3.位置参数变量 3.4.状态变量 4.条件测试和比较 ...
- Altium CAED 国际认证操作题例题(含下载)
官网介绍页面 https://www.altium.com.cn/certification 共五套操作题 含资料 蓝奏云:https://www.lanzous.com/i2lj1ng 百度网盘:h ...
- Github相册博客搭建
前一段时间我看见一个问答,大概意思就是程序员都是怎么用自己的专业技能逗女朋友或表白的. 看了很多,有写定时关机脚本恶搞的,也有简单写个html展示的,其中最著名的就是几年前有个人写了个网页记录他们在一 ...
- Unity导入模型出现 (Avatar Rig Configuration mis-match. Bone length in configuration does not match position in animation)?
昨天遇到这两个模型导入的问题,查了一下资料,自己摸索了一下解决方法..总结一下~ 出现的原因:(问题1)Warning 当模型文件导入以后并且设置Animation Type是Generic的时候,动 ...
- laravel从5.2到5.5从入门到精通视频教程共16套
laravel从5.2到5.5从入门到精通视频教程共16套,大部分都是实战项目比如P2P.博客.短网址.知乎门户.app软件开发.微信商城实战等 课程目录: 01.Laravel框架从入门到精通02. ...