解题: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 ...
随机推荐
- 20155216 实验一 逆向与Bof基础
实验一 逆向与Bof基础 一.直接修改程序机器指令,改变程序执行流程 使用 objdump -d pwn1 对pwn1文件进行反汇编. 可知main函数跳转至foo函数,先要使main函数跳转至get ...
- 20155334 《网络攻防》 Exp7 网络欺诈防范
20155334 <网络攻防> Exp7 网络欺诈防范 一.基础问题回答 通常在什么场景下容易受到DNS spoof攻击 同一局域网下,以及各种公共网络. 在日常生活工作中如何防范以上两攻 ...
- Luogu P3227 [HNOI2013]切糕
%%ZZKdalao上课讲的题目,才知道网络流的这种玄学建模 我们先想一想,如果没有D的限制,那么想当于再每一根纵轴上选一个权值最小的点再加起来 我们对应在网络流上就是每一根纵轴上的点向它下方的点用权 ...
- Hadoop日记Day16---命令行运行MapReduce程序
一.代码编写 1.1 单词统计 回顾我们以前单词统计的例子,如代码1.1所示. package counter; import java.net.URI; import org.apache.hado ...
- Selenium-Switch与SelectApi接口详解
Switch 我们在UI自动化测试时,总会出现新建一个tab页面.弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...
- PowerBI开发 第十三篇:增量刷新
PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...
- Asp.Net_Session跟Cookie的记住登陆名
最近在做ASP.NET的项目时,接触到了登陆权限模块,所有总结了一下登陆时用到的知识和方法技巧. 如图说明:实现的效果如图,由于验证码验证比较简单这里就不介绍了 首先用代码生成器生成项目,以三层为例进 ...
- Monkey稳定性测试
1.环境准备:Android SDK环境配置 2.手机连接/模拟器连接 : 1)手机打开开发者模式并允许USB连接 2)校验手机是否连接:打开cmd 输入 adb devices 3.查找apk包名及 ...
- Linux/Mac 挂载远程服务器目录到本地
1. 安装 sudo apt-get installsshfs 2. 创建SSHFS 挂载目录 sudo mkdir/mnt/siyuan 3.使用SSHFS 挂载远程的文件系统 sudo sshfs ...
- [咸恩静][Love effect]
歌词来源:http://music.163.com/#/song?id=31877654 作曲 : Monster Factory/양승욱 [作曲 : Monster Factory/yang-seu ...