解题: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 ...
随机推荐
- kettle学习笔记(七)——kettle流程步骤与应用步骤
一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...
- 20155338课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现
课程设计个人报告--基于ARM实验箱的Android交友软件的设计与实现 个人贡献 实验环境的搭建 代码调试 在电脑上成功运行 研究程序代码撰写小组报告 一.实验环境 1.Eclipse软件开发环境: ...
- 原生 JS 实现手机验证码倒计时
可以使用 pointer-events 来阻止元素成为鼠标事件的 target.html5 新增操作元素 class 类名的方式 classList. classList 方法 add(value): ...
- Java使用Redis学习笔记
如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <dependency ...
- Asp.Net_Mvc3.5语法_<%%>的用法
一. <%%>这种格式实际上就是和asp的用法一样的,只是asp中里面是vbscript或 者javascript代码,而在asp.net中用的是.net平台下支持的语言.特别 注意:服务 ...
- CentOS 6.8 安装Tomcat7
一.下载Tomcat到服务器上 将Tomcat包下载到devleoper(没有此目录创建一个)目录下: 二.解压安装包 下载好之后,直接解压,使用命令: .tar.gz # 是否使用sudo权限执行根 ...
- Unity光照与渲染设置学习笔记
学习了一下unity中有关光照和渲染的一些设置,现在才明白之前遇到的一些问题只是没有正确设置而已. unity不同版本的光照设置会有一些差异,而且可以调节的参数非常多,这里只记录一些重要的参数和使用方 ...
- CEPH FILESYSTEM
参考文档: CEPH FILESYSTEM:http://docs.ceph.com/docs/master/cephfs/ CephFS best practices:http://docs.cep ...
- 第十一周PSP&进度条
PSP 一.表格: D日期 C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月24号 站立会议 分配任务&设计final方案 1 ...
- [转载] Activiti Tenant Id 字段释疑
TENANT_ID_ : 这个字段表示租户ID.可以应对多租户的设计. 转载自: http://www.cnblogs.com/yg_zhang/p/4201288.html http://www. ...