解题: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 ...
随机推荐
- XSS Challenges练习及解答
一个偶然的机会在知道创宇的技能表里看到了一个练习XSS的网站http://xss-quiz.int21h.jp,正好想研究这个,于是试着做了一下. 第一.二题是最简单的,直接在搜索框中输入以下代码就成 ...
- EasyUI-Tree的使用
在web开发中,树是比较常见的东西.以前用过zTree,也用过EasyUI-Tree,过了好久后发现都忘记怎么用了. 这几天重新回顾了EasyUI-tree的使用,在此将相关知识点记录 ...
- 总结:C# 委托的全面理解
在说事件之前得先了解委托. 委托,外表看来和C/C++中函数指针没什么区别,但是本质上你才发现他其实就是个类!也就是说理解委托得从 这个两个方面去理解(单从一个方面去理解感觉就怪怪的呵呵!) 理解委托 ...
- EAS_BI(扩展报表)
case when 的使用 1. 扩展报表,一张收费单据中,下面分为分录 问题描述: 收费单中有一个分录用于记录检测的项目名称以及标准费用.收费单有自己的主键,分录中的外键即是收费单的主键,然后分录表 ...
- 基于RapidJSON的操作库
需要安装配置RapidJSON库 /******************************************************************* * summery: 提供便 ...
- R绘图 第十篇:绘制文本、注释和主题(ggplot2)
使用ggplot2包绘制时,为了更直观地向用户显示报表的内容和外观,需要使用geom_text()函数添加文本说明,使用annotate()添加注释,并通过theme()来调整非数据的外观. 一,文本 ...
- python中列表的常用操作增删改查
1. 列表的概念,列表是一种存储大量数据的存储模型. 2. 列表的特点,列表具有索引的概念,可以通过索引操作列表中的数据.列表中的数据可以进行添加.删除.修改.查询等操作. 3. 列表的基本语法 创建 ...
- OpenCV操作像素
在了解了图像的基础知识和OpenCV的基础知识和操作以后,接下来我们要做的就对像素进行操作,我们知道了图像的本质就是一个矩阵,那么一个矩阵中存储了那么多的像素,我们如何来操作呢?下面通过几个例子来看看 ...
- shell 的 export命令
export 功能说明:设置或显示环境变量.语 法:export [-fnp][变量名称]=[变量设置值]补充说明:在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删 ...
- jmeter学习(1)基础支持+安装部署
1. Apache jmeter 是100%的java桌面应用程序 支持的协议有:WEB-HTTP/HTTPS , SOAP, FTP, JDBC, LDAP, MAIL, MongoDB ...