YBTOJ:最短时间(长链剖分、线段树)

解析

不难得到最优策略:先尽可能的快的送死直到路径畅通无组,然后一口气冲到t点。
现在的难点就在于如何尽可能的快的送掉特定的次数。
不难发现,花费时间关于死亡次数的函数必然是一个下凸包。

fx,if_{x,i}fx,i 表示子树内距离 xxx 不超过 i 的节点的最大 www
设当前询问 (s,t)(s,t)(s,t) 路径上需要的最大死亡次数为 mxmxmx,找到最小的 i 满足 fs,i≥wf_{s,i}\ge wfs,iw,那么答案可以写成 mx∗i−∑j=1i−1fs,jmx*i-\sum_{j=1}^{i-1}f_{s,j}mxij=1i1fs,j
不难想到利用线段树来维护这个 fff
但是暴力合并显然复杂度无法接受,由于这个距离与深度有关,考虑长链剖分,一条长链的点共用一个线段树。每次合并的时候把儿子的整条链一个点一个点暴力修改上去即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return f*x;
}const int N=3e5+100;
int n,m;
struct edge{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(edge){y,fi[x]};fi[x]=cnt;
}
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
struct Segment_Tree{int n;vector<ll>mn,laz,sum;void init(int L){mn.resize(L<<2);laz.resize(L<<2);sum.resize(L<<2);n=L-1;}inline void pushup(int k){mn[k]=min(mn[ls],mn[rs]);sum[k]=sum[ls]+sum[rs];return;}inline void add(int k,int l,int r,ll w){mn[k]=w;sum[k]=(r-l+1)*w;laz[k]=w;}inline void pushdown(int k,int l,int r){ll o=laz[k];laz[k]=0;if(!o) return;add(ls,l,mid,o);add(rs,mid+1,r,o);return;}void change(int k,int l,int r,int x,int y,ll w){if(x<=l&&r<=y){add(k,l,r,w);return;}pushdown(k,l,r);if(x<=mid) change(ls,l,mid,x,y,w);if(y>mid) change(rs,mid+1,r,x,y,w);pushup(k);}ll asksum(int k,int l,int r,int x,int y){if(x<=l&&r<=y) return sum[k];pushdown(k,l,r);ll res(0);if(x<=mid) res+=asksum(ls,l,mid,x,y);if(y>mid) res+=asksum(rs,mid+1,r,x,y);return res;}int find(int k,int l,int r,int w){//last pl that val<wif(l==r) return l;pushdown(k,l,r);if(mn[rs]<w) return find(rs,mid+1,r,w);else return find(ls,l,mid,w);}inline ll Asksum(int l,int r){return asksum(1,0,n,l,r);}inline int Find(int w){return find(1,0,n,w);}inline void update(int pl,int w){if(mn[1]>w) return;int ed=Find(w);if(pl<=ed) change(1,0,n,pl,ed,w);      return;}
}tr[N];int w[N];
int len[N],dep[N],top[N],son[N],pl[N][20],mx[N][20];
void dfs(int x,int f){dep[x]=dep[f]+1;len[x]=1;if(f){pl[x][0]=f;mx[x][0]=w[f];for(int k=1;pl[x][k-1];k++){pl[x][k]=pl[pl[x][k-1]][k-1];mx[x][k]=max(mx[x][k-1],mx[pl[x][k-1]][k-1]);}}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;dfs(to,x);if(len[to]+1>len[x]){son[x]=to;len[x]=len[to]+1;}}return;
}
inline int add(int x){return dep[x]-dep[top[x]];
}vector<int>v[N];
ll d[N],ans[N];void solve(int x){if(x==top[x]){tr[x].init(len[x]);}if(son[x]){top[son[x]]=top[x];solve(son[x]);}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==son[x]) continue;top[to]=to;solve(to);for(int i=0;i<len[to];i++){tr[top[x]].update(i+1+add(x),tr[to].Asksum(i,i));}}for(int id:v[x]){int pl=tr[top[x]].Find(d[id])+1;ans[id]+=(pl-add(x))*d[id];if(add(x)<pl) ans[id]-=tr[top[x]].Asksum(add(x),pl-1);}//debug("x=%d top=%d\n",x,top[x]);tr[top[x]].update(add(x),w[x]);
}inline int calc(int x,int y){int ans(0);for(int k=18;k>=0;k--){if(dep[pl[x][k]]<=dep[y]) continue;ans=max(ans,mx[x][k]);x=pl[x][k];}return ans;
}int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();for(int i=1;i<=n;i++) w[i]=read();for(int i=2;i<=n;i++) addline(read(),i);dfs(1,0);m=read();for(int i=1;i<=m;i++){int s=read(),t=read();ans[i]+=dep[t]-dep[s];v[s].push_back(i);d[i]=calc(t,s);}top[1]=1;solve(1);for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)

文章目录descriptionsolutioncode【模板】k短路 / [SDOI2010]魔法猪学院description iPig 在假期来到了传说中的魔法猪学院&#xff0c;开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后&#xff0c;iPig 对猪世界的世界本原有了很多的了解&#xff1…

Infinite Fraction Path UVALive - 8207

Infinite Fraction Path UVALive - 8207 题意&#xff1a; 给你n个数&#xff0c;每个数在0到9之间&#xff0c;每个数的下标一次是0~n-1&#xff0c;然后他所能走到的数为(i^21)%n,i为他本身的下标&#xff0c;然后让你求走n步&#xff0c;每一步的数相连&#xff0c;形成的…

YBTOJ洛谷P4869:出现位置(线性基)

解析 关键结论&#xff1a; 若 nnn 个数组成的线性基大小为 SSS&#xff0c;则其子集异或组成的结果有 2S2^S2S 种&#xff0c;且每种结果都有 2n−S2^{n-S}2n−S 种方案。 证明&#xff1a;考虑 n−Sn-Sn−S 个没有加入线性基的元素的任意一个子集&#xff0c;其异或和为 xxx…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分&#xff0c;我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库&#xff0c;是针对Microsoft Graph开发的场景的&#xff0c;有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

2017 ICPC沈阳区域赛

2017 沈阳区域赛 题号题目难度知识点ABBP FormulaBBridgeCEmpty Convex PolygonsDDefense of the AncientsEFive-round Show HandFHeron and His Triangle铜牌题推式子思维GInfinite Fraction Path快银稳铜dfs剪枝HLegends of the Three KingdomsILittle Boxes签到题大数JNew …

YBROJ洛谷P3211:XOR和路径(线性基,期望dp)

解析 不难想到第一步利用期望线性性逐位考虑。 然后就变成求一个布尔变量的期望了&#xff0c;可以直接转化为求概率。 我一开始的想求从1出发异或和为0/1的概率&#xff0c;然而这个东西在原点1附近的转移特别别扭…老出现概率大于1的迷惑情况。 然后我就不会了 正解是反过…

切题 (problem)(线段树+最大流最小割)

切题 problemdescriptionsolutioncodedescription 在一个神秘的 JOSLFN 上&#xff0c;wzy 和 lqs2015 常年占据着切题榜的 rk1 和 rk2。现在他们在研究 如何快速造题并验题。 分工是这样的&#xff1a;有 n 个 wzy 负责造题&#xff0c;第 i 个 wzy 会造出恰好 ai 道题。有 m…

通过 Azure Pipelines 实现持续集成之docker容器化

IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps Pipeline。实现 Docker 容器化的持续集成实现的目标&#xff1a…

YBTOJ:最小数(欧拉函数)

解析 题意可以化为&#xff1a; 8∗10x−19kn08*\frac{10^x-1}{9}kn08∗910x−1​kn0 然后用 8 尽可能的消去 9n9n9n 中的2的幂次&#xff0c;随后问题转化为&#xff1a; 10x≡1(modn′)10^x\equiv 1\pmod {n}10x≡1(modn′) 然后…我就觉得这个是exbsgs了… 但其实完全不用阿…

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意&#xff1a; 现在大家决定玩一个游戏&#xff0c;指定一个整数闭区间 [a,b]&#xff0c;问这个区间内有多少个不降数。 题解&#xff1a; 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数&#xff0c;…

天下第一 txdy (LCT+双指针+线段树)

天下第一 txdydescriptionsolutioncodedescription djq_cpp 是天下第一的。 djq_cpp 给了你一个 n 个点 m 条边的无向图&#xff08;无重边自环&#xff09;&#xff0c;点标号为 1 ∼n。祂想要考考你&#xff0c; 有多少对整数对 (l, r) 满足&#xff1a; • 1 ≤l ≤r ≤n •…

Acwing 1083. Windy数

Acwing 1083. Windy数 题意&#xff1a; Windy 定义了一种 Windy 数&#xff1a;不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。 Windy 想知道&#xff0c;在 A 和 B 之间&#xff0c;包括 A 和 B&#xff0c;总共有多少个 Windy 数&#xff1f; 题解&am…

【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师

南京纳龙科技有限公司成立于2002年12月&#xff0c;隶属纳龙科技在南京成立的研发中心&#xff0c;坐落于南京市雨花台区。公司立志以守护人类心脏健康为使命&#xff0c;专注推动心电信息化技术的发展&#xff0c;为全国各级医疗机构提供心电检查、诊断一体化的解决方案。公司…

模板:k短路(可并堆)

所谓k短路&#xff0c;就是第k短的路。 &#xff08;逃&#xff09; 解析 给出一个有向图&#xff0c;求 s−ts-ts−t 的不严格第 k 短的路径。 A*算法 对于一个状态 (x,cost)(x,cost)(x,cost)&#xff0c;即到 xxx 时走过长度为 costcostcost&#xff0c;定义一个估价函数&a…

大鱼吃小鱼(fhq-treap/线段树二分+贪心)

大鱼吃小鱼descriptionsolutioncodedescription 《大鱼吃小鱼》是一款经典的儿童益智类游戏&#xff0c;在游戏中&#xff0c;玩家所操控的“大鱼”只能吃掉体积严格小于自己的“小鱼”&#xff0c;然后玩家所操控的“大鱼”的体积就会增加“小鱼”的体积这么多的量。 知名主…

Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

题意&#xff1a; 求给定区间 [X,Y] 中满足下列条件的整数个数&#xff1a;这个数恰好等于 K 个互不相等的 B 的整数次幂之和。 题解&#xff1a; 数位DP 技巧1&#xff1a;[X,Y]>f(Y)-f(X-1) 技巧2&#xff1a;用树的方式来考虑。 在本题中&#xff0c;题意是问[X,Y]中…

EFCore动态切换Schema

最近做个分库分表项目&#xff0c;用到schema的切换感觉还是有些坑的&#xff0c;在此分享下。 先简要说下我们的分库分表分库分表规则我定的规则是&#xff0c;订单号&#xff08;数字&#xff09;除以16&#xff0c;得出的结果为这个订单所在的数据库&#xff0c;然后他的余数…