解题: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 ...
随机推荐
- 20155204 王昊《网络对抗技术》EXP2 后门原理与实践
20155204 王昊<网络对抗技术>EXP2 后门原理与实践 一.实验内容 准备工作(试用ncat.socat) 1. 使用netcat获取主机操作Shell,cron启动. 明确目标: ...
- 20155307《网络对抗》MSF基础应用
实验过程 实验系统 所需设备: 靶机1:Windows XP Professional SP2 ,IP地址:192.168.1.128 靶机2:Windows XP Professional SP3 ...
- EZ 2017 12 17初二初三第一次膜你赛
以后平时练习还是写一写吧. (题目搞来搞去太烦了,直接PDF存起来) T1 水题(???),主要是数据水,正解是设一个阙值,然而根本没人打.(暴力出奇迹) CODE #include<cstdi ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...
- SSRS配置2:加密管理
在初始化Reporting Service时,SSRS会自动创建数据库[ReportServer],用于存储报表元数据,报表订阅,以及凭证(Credential)和连接信息等身份验证信息,身份验证数据 ...
- 7、Docker监控方案(cAdvisor+InfluxDB+Grafana)
一.组件介绍 我们采用现在比较流行的cAdvisor+InfluxDB+Grafana组合进行Docker监控. 1.cAdvisor(数据采集) 开源软件cAdvisor(Container Adv ...
- VirtualBox虚拟机怎么导入已经存在的vdi文件
VirtualBox虚拟机怎么导入已经存在的vdi文件 第一章 1.原因 早上一不小心将virtualBox 卸载了,(不知道怎么了, 里面得虚拟机全部都没有了,但是vdi文件还在) 2.解决办法 直 ...
- FME Cloud 账号申请流程
第一步,访问SAFE的FME Cloud注册页,官网明确表态,如果你是一个新的FME Cloud用户,你可以免费获得一个初级版.地址:https://console.fmecloud.safe.com ...
- cbuild-一个创建和管理C++项目的工具
cbuild-一个创建和管理C++项目的工具 介绍: 这是个人开发的一个管理C++项目的工具,用shell脚本编写. 可能会不定期更新,也欢迎大家一起完善. 当前开发版本0.5.各版本功能如下: ve ...
- Jupyter Notebook 工作空间 / 默认路径 的设置方式
Jupyter notebook 安装后,启动后,默认的工作空间是当前用户目录.为了方便对文档进行管理,往往需要自行设置工作空间. 下面介绍两种亲试有效的工作空间设置方法. 1.修改快捷方式 对 Ju ...