博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)
阅读量:5159 次
发布时间:2019-06-13

本文共 2008 字,大约阅读时间需要 6 分钟。

这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= =

不得不说CLJ说得真的太简单了,实现方面根本没提。

首先我们可以先用树分治构建出这棵树的分治树,也就是把这棵树的重心作为根节点然后子树为他的子树的重心这样递归下去,然后每个节点存的是其子树的信息。

对于每个节点我们保存这个子树的dv的总和已经把该节点作为点的答案值

这样对于修改能在log n的时间内解决

寻找答案的时候,我们可以发现,如果现在节点的子树dv和*2大于总节点,那么向那个方向过去一定比原方案好

我们先从根节点开始,若发现答案在某棵子树时,我们考虑如何使其儿子节点的答案转变为整个树的答案,可以发现把除这个子树外的所有节点可以缩成一个节点并连在这棵子树上,然后就可以一直这样做下去,找到操作之后再把这些撤销

因此还是得维护一些奇奇怪怪的东西,但打出来还是挺短的

Code:

#include
#include
#include
#include
#include
using namespace std;#define maxn 100100typedef long long ll;typedef pair
ii;typedef pair
iii;#define fi first#define se second#define pb push_backstruct edges{ int to,next,dist;}edge[maxn*2];int l,next[maxn];inline void addedge(int x,int y,int z) { edge[++l]=(edges){y,next[x],z};next[x]=l; edge[++l]=(edges){x,next[y],z};next[y]=l;}bool done[maxn];int s[maxn],f[maxn],root,size;void dfs(int u,int fa){ s[u]=1;f[u]=0; int v=0; for (int i=next[u];i;i=edge[i].next) { if (done[v=edge[i].to]||v==fa) continue; dfs(v,u); s[u]+=s[v]; f[u]=max(f[u],s[v]); } f[u]=max(f[u],size-s[u]); if (f[u]
pre[maxn];void getdist(int u,int fa,int tar,int dist) { pre[u].pb(ii(tar,dist)); s[u]=1;int v=0; for (int i=next[u];i;i=edge[i].next) { if (done[v=edge[i].to]||v==fa) continue; getdist(v,u,tar,dist+edge[i].dist); s[u]+=s[v]; }}vector
ch[maxn];void work(int u){ done[u]=1; int v=0; pre[u].pb(ii(u,0)); for (int i=next[u];i;i=edge[i].next) { if (done[v=edge[i].to]) continue; getdist(v,0,u,edge[i].dist); f[0]=size=s[v]; dfs(v,root=0); ch[u].pb(iii(root,ii(v,edge[i].dist))); work(root); }}ll cnt[maxn],sum[maxn];vector
sumdist[maxn];inline void update(int x,ll y,ll z){ for (int i=0;i
record;inline ll query(){ int x=realroot; int mx=0; record.clear(); while (x){ mx=0; for (int i=1;i
(ch[i].size(),0); while (Q--) { int x,y; scanf("%d%d",&x,&y); update(x,y,0); printf("%lld\n",query()); } return 0;}

 

转载于:https://www.cnblogs.com/New-Godess/p/4420824.html

你可能感兴趣的文章
Java语法糖初探(三)--变长参数
查看>>
Liunx常用命令(Mile)
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
spring boot开发REST接口
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
常用ContentType对照表
查看>>
nginx部署注意应该将本来的conf和conf.default里面添加 include conf.d/*.conf;
查看>>
Redis PHP连接操作
查看>>
执法文书打印的实现(三)(word→png的实现)
查看>>
Looper.loop() android线程中的消息循环
查看>>
Dalvik虚拟机JNI方法的注册过程分析
查看>>
java中文乱码解决之道(四)—–java编码转换过程
查看>>
《Linux运维趋势》2010-2013年全部期刊下载
查看>>
2015-04-20一些知识点
查看>>
[转]Python与设计模式
查看>>
多线程的自动管理(线程池)
查看>>