P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】

正题

题目链接:https://www.luogu.com.cn/problem/P3345


题目大意

nnn个点的一棵树,每次修改一个点的点权后询问一个xxx最小化∑y=1ndis(x,y)∗dy\sum_{y=1}^ndis(x,y)*d_yy=1ndis(x,y)dy


解题思路

先是构建一个点分树,然后考虑如何计算答案。

我们定义一个frxfr_xfrx表示点分树上faxfa_xfaxxxx所在子树的路径上第一个节点,我们可以比较frxfr_xfrx的答案和faxfa_xfax的答案,如果frxfr_xfrx更大,那么就向xxx移动。那么如何计算两个节点的答案的,我们需要维护三个值sdx,sxx,sfxsd_x,sx_x,sf_xsdx,sxx,sfx分别表示(下面的子树都是点分子树)xxx子树内的点权和,xxx子树内的∑y=1ndis(x,y)∗dy\sum_{y=1}^ndis(x,y)*d_yy=1ndis(x,y)dyxxx子树内的所有点∑y=1ndis(fax,y)∗dy\sum_{y=1}^ndis(fa_x,y)*d_yy=1ndis(fax,y)dy

这样我们就可以通过枚举到根节点的路径计算每个点的答案,时间复杂度O(nlog⁡3n)O(n\log^3 n)O(nlog3n)(因为有LCALCALCA求路径长度)。

考虑优化,我们可以用RMQRMQRMQLCALCALCA,每次到一个点时序列中加入这个点,然后回退时加入父节点,之后询问一个区间中深度最小的节点即可。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#define mp(x,y) make_pair(x,y)
#define ll long long
using namespace std;
const int N=2e5+10,T=22;
struct node{int to,next,w;
}a[N*2];
int n,m,tot,cnt,ls[N],dep[N],dis[N],f[N][T],lg[N],dfn[N],rfn[N];
int num,root,f0[N],siz[N],fa[N],sd[N],fr[N];ll sw[N],sx[N];
bool v[N];vector<int> e[N];stack<int> s;
//struct heap{
//	priority_queue<pair<int,int> > q1,q2;
//	void push(pair<int,int> x)
//	{q1.push(x);return;}
//	void pop(pair<int,int> x)
//	{q2.push(x);return;}
//	pair<int,int> top(){
//		while(!q2.empty()&&q1.top()==q2.top())
//			q1.pop(),q2.pop();
//		return q1.top();
//	}
//	int size(){return q1.size()-q2.size();}
//}q[N];
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void dfs(int x,int fa){dfn[++cnt]=x;rfn[x]=cnt;dep[x]=dep[fa]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dis[y]=dis[x]+a[i].w;dfs(y,x);dfn[++cnt]=x;}return;
}
void init(){dfs(1,1);for(int i=1;i<=cnt;i++)f[i][0]=dfn[i];for(int i=2;i<=cnt;i++)lg[i]=lg[i/2]+1;for(int j=1;(1<<j)<=cnt;j++)for(int i=1;i+(1<<j)-1<=cnt;i++){int x=f[i][j-1],y=f[i+(1<<j-1)][j-1];f[i][j]=dep[x]<dep[y]?x:y;}return;
}
int LCA(int x,int y){int l=rfn[x],r=rfn[y];if(l>r)swap(l,r);int z=lg[r-l+1];x=f[l][z];y=f[r-(1<<z)+1][z];return dep[x]<dep[y]?x:y;
}
int get_dis(int x,int y)
{return dis[x]+dis[y]-2*dis[LCA(x,y)];}
void groot(int x,int fa){siz[x]=1;f0[x]=0;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa||v[y])continue;groot(y,x);siz[x]+=siz[y];f0[x]=max(f0[x],siz[y]);}f0[x]=max(f0[x],num-siz[x]);if(f0[x]<f0[root])root=x;return;
}
void build(int x){v[x]=1;int S=num;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(v[y])continue;num=(siz[y]>siz[x])?(S-siz[x]):(siz[y]);root=0;groot(y,x);fr[root]=y;y=root;build(y);fa[y]=x;e[x].push_back(y);}return;
}
ll count(int x){ll ans=sx[x];for(int y=x;fa[y];y=fa[y])ans+=1ll*(sd[fa[y]]-sd[y])*get_dis(x,fa[y])+sx[fa[y]]-sw[y];return ans;
}
int main()
{freopen("tree1.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}init();num=n;f0[0]=n;groot(1,1);int pr=root;build(root);while(m--){int x,w,y;scanf("%d%d",&x,&w);y=x;while(x){ll z=1ll*w*get_dis(y,fa[x]?fa[x]:x);sw[x]+=z;sx[fa[x]]+=z;sd[x]+=w;x=fa[x];}x=pr;ll ans=count(x);while(1){if(e[x].empty())break;ll z=0;bool flag=0;ans=count(x);for(int i=0;i<e[x].size();i++)if((z=count(fr[e[x][i]]))<ans){x=e[x][i];flag=1;break;}if(flag)continue;break;}ans=count(x);printf("%lld\n",ans);}return 0;
}

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

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

相关文章

[XSY]Illyasviel的图游戏(博弈论)

Illyasviel的图游戏 除了1号点和n号点每个点度数小于等于2&#xff0c;因此1 到 n 的所有简单路径互不相交。 在结束游戏前的最后一步一定是剩下一条 1 到 n 的路径&#xff0c;并且路径上的权值全都是1。 游戏总步数确定&#xff0c;如果剩下的最后一条路径确定了&#xff…

【dfs】数独游戏(ybtoj dfs-1-2)

数独游戏 ybtoj dfs-1-3 题目大意 给出一个未完成的数独&#xff0c;让你完成它 输入样例 4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4...... ......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3. end…

数学知识总结——矩阵

1 矩阵及其运算 由mnm\times nmn个数aija_{ij}aij​排成的mmm行nnn列的数表称为mmm行nnn列的矩阵&#xff0c;简称mnm\times nmn矩阵。记作&#xff1a; A[a11a12...a1na21a22...a2n............am1am2...amn]A\begin{bmatrix} a_{11} & a_{12} & ...&a_{1n}\\ a_…

.Net业务搭配实用技术栈

前言昨天有篇文章在讨论webform的设计思路&#xff0c;我已经四五年不用webform了&#xff0c;虽然它也提供了HttpModule和httphandle来处理请求&#xff0c;提供了一般处理程序ashx来简化处理流程&#xff0c;但依然会想起它的form runatserver&#xff0c;想起注册客户端脚本…

【dfs】虫食算(ybtoj dfs-1-3)

虫食算 ybtoj dfs-1-3 题目大意 给出一个如ABC的N进制的式子&#xff0c;现在知道某些位上的数字是相同的&#xff0c;让你求出这个式子 样例输入 5 ABCED BDACE EBBAA样例输出 1 0 3 4 2数据范围 1⩽N⩽261\leqslant N \leqslant 261⩽N⩽26 解题思路 从低位到高位枚举…

牛客网 【每日一题】6月11日题目精讲 背包

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码:题目描述 Applese有1个容量为v的背包&#xff0c;有n个物品&#xff0c;每一个物品有一个价值ai&#xff0c;以及一个大小bi 然后他对此提出了自己的疑问&#xff0c;如果我不要装的物品装的价值最大&#xff0c;只是一…

P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4899 题目大意 nnn个点的一张无向图&#xff0c;每次询问(s,t,l,r)(s,t,l,r)(s,t,l,r)表示询问能否找到一条s∼ts\sim ts∼t的路径使得该路径可以分割成点的序号在[l,n][l,n][l,n]和[1,r][1,r][1,r]的两段。 解题思路 首先对…

min_25筛

用途 设f(x)f(x)f(x)是一个积性函数&#xff0c;min_25筛可以在O(n34log⁡n)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43​​)内求f(x)f(x)f(x)的前缀和&#xff1a;∑i1Nf(i)\sum_{i1}^{N}f(i)∑i1N​f(i) 使用要求&#xff1a;f(p),f(pk)f(p),f(p^k)f(p),f(pk)的值可以快速…

Service Fabric 用 Powershell 部署应用到本地

前置说明安装 Service Fabric SDK&#xff0c;会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK 生成部署脚本&#xff0c;如下图&#xff1a;用VS创建一个 Service Fabric 应用后&#xff0c;有一个部署脚本&#xff0c;位置在 [应用…

【期望】路径长度(金牌导航 期望-1)

路径长度 金牌导航 期望-1 题目大意 给出一个图&#xff0c;问你从1走到n的期望路径长度 输入样例 4 4 1 2 1 1 3 2 2 3 3 3 4 4输出样例 7.00数据范围 1⩽n⩽1051\leqslant n \leqslant 10^51⩽n⩽105 1⩽m⩽2n1\leqslant m\leqslant 2\times n1⩽m⩽2n 1⩽u,v⩽n1\…

牛客网 【每日一题】6月8日 [SCOI2005]最大子矩阵

链接&#xff1a; 文章目录题目描述题目描述 这里有一个n*m的矩阵&#xff0c;请你选出其中k个子矩阵&#xff0c;使得这个k个子矩阵分值之和最大。 注意&#xff1a;选出的k个子矩阵 不能相互重叠。 输入描述: 第一行为n,m,k&#xff08;1 ≤ n ≤ 100,1 ≤ m ≤ 2,1 ≤ k ≤ …

CF1054D-Changing Array【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1054D 题目大意 一个长度为nnn的序列&#xff0c;每个数小于2k2^k2k&#xff0c;可以选择一些数xorxorxor上2k−12^k-12k−1。要求使得满足alxoral1xor...xorar0a_l\ xor\ a_{l1}\ xor...xor\ a_r0al​ xor al1​ xor...xo…

ElasticSearch入门 附.Net Core例子

1.什么是ElasticSearch?Elasticsearch是基于Lucene的搜索引擎。它提供了一个分布式&#xff0c;支持多租户的全文搜索引擎&#xff0c;它具有HTTP Web界面和无模式JSON文档。 Elasticsearch是用Java开发的&#xff0c;根据Apache许可条款作为开源发布。----来自维基百科的解释…

[XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

Tree Ext 这道题相当于把3道题合了起来。 要求修复的边中恰好有 k 条白边&#xff1a; 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) bzoj2654 tree(WQS二分 新科技get) 是最小生成树计数而非生成树计数&#xff1a; BZOJ1016」[JSOI2008] 最小生成树计数 具体可以看看…

【期望】乘坐电梯(金牌导航 期望-2)

乘坐电梯 金牌导航 期望-2 题目大意 有n个人&#xff0c;对于没一个单位时间有p的概率最前面的1个人进电梯&#xff0c;有&#xff08;1-p&#xff09;的概率不进&#xff0c;问你t个单位时间后&#xff0c;电梯中的期望人数 样例输入 1 1 0.50 1 样例输出 1 0.5 样例输入…

动态规划练习【一】 背包问题

详细讲解 背包问题大汇总 文章目录背包问题大汇总01背包问题&#xff1a;思路&#xff1a;空间优化复杂度代码总结&#xff1a;完全背包问题&#xff1a;思路&#xff1a;代码&#xff1a;优化多重背包问题&#xff1a;思路&#xff1a;代码&#xff1a;单调队列优化混合三种背…

P3329-[ZJOI2011]最小割【最小割树】

正题 题目链接:https://www.luogu.com.cn/problem/P3329 题目大意 nnn个点mmm条边的无向图&#xff0c;每次询问一个xxx表示最小割不超过xxx的点对数量。 解题思路 我们对于两个点sss到ttt完成网络流后的残量网络上&#xff0c;与sss联通的点属于点集SSS&#xff0c;与ttt联通…

《.NET 性能优化》送书活动结果公布

截止到9月7日18&#xff1a;00&#xff08;规则本是12&#xff1a;00&#xff0c;忙的忘记了这事&#xff0c;18点截的图&#xff09;&#xff0c;本次送书活动《.NET 性能优化》共收到100多位同学参与回复&#xff0c;本次很多同学在看到活动的书 &#xff0c;自行就到异步社区…

【期望】期望收益(金牌导航 期望-3)

期望收益 金牌导航 期望-3 题目大意 给你一个01串&#xff0c;有些位置是未知的&#xff0c;连续的x个1贡献为想x2x^2x2&#xff0c;现在问你该串的期望贡献 输入样例 4 ????输出样例 4.1250数据范围 1⩽n⩽31051\leqslant n \leqslant 3\times 10^51⩽n⩽3105 解题…

杜教筛技巧随记

常见完全积性函数&#xff1a; ϵ(n)[n1]ϵ(n)[n1]ϵ(n)[n1]&#xff08;元函数&#xff0c;满足f∗ϵff*ϵff∗ϵf&#xff09; I(n)1I(n)1I(n)1 id(n)nid(n)nid(n)n 常见卷积&#xff1a; μ∗Iϵ\mu* Iϵμ∗Iϵ ϕ∗Iid\phi*Iidϕ∗Iid f(n)∑i1niϕ(i)f(n)\sum_{i1}^{n}i…