[ZJOI2015]幻想乡战略游戏

思路:

  树剖暴力转移;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
struct TreeNodeType {
ll l,r,sum,mid;
};
struct TreeNodeType tree[maxn<<];
ll n,m,head[maxn],E[maxn<<],V[maxn<<],W[maxn<<],cnt;
ll id[maxn],sum[maxn],f[maxn],top[maxn],deep[maxn],size[maxn];
ll lar[maxn],dis[maxn],End[maxn],live,P=,Sum;
inline void in(ll &now)
{
ll if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
}
inline void edge_add(ll u,ll v,ll w)
{
E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;
}
void dfs1(ll now,ll fa)
{
f[now]=fa,deep[now]=deep[fa]+,size[now]=;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==f[now]) continue;
dis[V[i]]=dis[now]+W[i],dfs1(V[i],now),size[now]+=size[V[i]];
if(size[lar[now]]<size[V[i]]) lar[now]=V[i];
}
}
void dfs2(ll now,ll chain)
{
top[now]=chain,id[now]=++cnt;
if(lar[now]) dfs2(lar[now],chain);
for(ll i=head[now];i;i=E[i])
{
if(V[i]==lar[now]||V[i]==f[now]) continue;
dfs2(V[i],V[i]);
}
End[now]=cnt;
}
ll find(ll x,ll y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) y=f[top[y]];
else x=f[top[x]];
}
return deep[x]<deep[y]?x:y;
}
void build(ll now,ll l,ll r)
{
tree[now].l=l,tree[now].r=r;
if(l==r) return;tree[now].mid=l+r>>;
build(now<<,l,tree[now].mid);
build(now<<|,tree[now].mid+,r);
}
void add(ll now,ll to,ll x)
{
if(tree[now].l==tree[now].r)
{
tree[now].sum+=x;
return;
}
if(to<=tree[now].mid) add(now<<,to,x);
else add(now<<|,to,x);
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
}
ll query(ll now,ll to)
{
if(tree[now].l>=id[to]&&tree[now].r<=End[to]) return tree[now].sum;
ll res=;if(id[to]<=tree[now].mid) res+=query(now<<,to);
if(End[to]>tree[now].mid) res+=query(now<<|,to);return res;
}
ll Try(ll to)
{
ll pos=query(,to),res=live;
res-=pos*(dis[to]-dis[P]);
res+=(Sum-pos)*(dis[to]-dis[P]);
return res;
}
ll TryF()
{
ll pos=query(,P),res=live;
res-=(Sum-pos)*(dis[P]-dis[f[P]]);
res+=pos*(dis[P]-dis[f[P]]);
return res;
}
ll Search()
{
ll res=,res_=live,pos;
for(ll i=head[P];i;i=E[i])
{
if(V[i]==f[P])
{
pos=TryF();
if(pos<res_) res=V[i],res_=pos;
}
else
{
pos=Try(V[i]);
if(pos<res_) res=V[i],res_=pos;
}
}
if(res) P=res,live=res_;
return res;
}
int main()
{
//freopen("data.txt","r",stdin);
freopen("zjoi15_tree.in","r",stdin);
freopen("zjoi15_tree.out","w",stdout);
in(n),in(m);ll u,v,w,lca,tmp;
for(ll i=;i<n;i++) in(u),in(v),in(w),edge_add(u,v,w);
cnt=,dfs1(,),dfs2(,),build(,,n);
while(m--)
{
in(u),in(w),add(,id[u],w),lca=find(P,u),Sum+=w;
live+=w*(dis[u]+dis[P]-dis[lca]*);
while(Search());printf("%lld\n",live);
}
return ;
}

AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345的更多相关文章

  1. 洛谷 P3345 [ZJOI2015]幻想乡战略游戏 解题报告

    P3345 [ZJOI2015]幻想乡战略游戏 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做 ...

  2. [ZJOI2015]幻想乡战略游戏——动态点分治

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...

  3. BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】

    BZOJ3924 ZJOI2015 幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂 ...

  4. 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治

    [BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...

  5. bzoj3924 [Zjoi2015]幻想乡战略游戏 点分树,动态点分

    [BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...

  6. 洛谷P3345 [ZJOI2015]幻想乡战略游戏(动态点分治,树的重心,二分查找,Tarjan-LCA,树上差分)

    洛谷题目传送门 动态点分治小白,光是因为思路不清晰就耗费了不知道多少时间去gang这题,所以还是来理理思路吧. 一个树\(T\)里面\(\sum\limits_{v\in T} D_vdist(u,v ...

  7. 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)

    大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...

  8. BZOJ3924 [Zjoi2015]幻想乡战略游戏

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  9. 洛谷P3345 [ZJOI2015]幻想乡战略游戏 [动态点分治]

    传送门 调了两个小时,终于过了-- 凭啥人家代码80行我180行啊!!! 谁叫你大括号换行 谁叫你写缺省源 思路 显然,补给点所在的位置就是这棵树的带权重心. 考虑size已知时如何找重心:一开始设答 ...

随机推荐

  1. JNA的用法

    JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...

  2. HDU 5646

    DZY Loves Partition Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  3. MFC单文档多视图程序设计与Splitter拆分窗口

    1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDI ...

  4. [LeetCode] 2. Add Two Numbers ☆☆

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  5. 在不安装Windows服务的情况下,如何进行调试或测试

    最近由于项目需要,写了几个Windows服务,可是如何对其进行测试呢? 如果通过命令Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ...

  6. jenkins Process leaked file descriptors

    https://stackoverflow.com/questions/17024441/process-leaked-file-descriptors-error-on-jenkins 1. BUI ...

  7. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序

    Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...

  8. TOJ 1005 Hero In Maze (深搜)

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他知道公主在迷宫 ...

  9. idea 导入 java json 包

    1.java 项目导包 找到 External Libraries 下面的java版本包,在点击鼠标右键.直接找到jar路径全部选中导入即可.

  10. div圆角

    div{    -moz-border-radius: 10px;    -webkit-border-radius: 10px;    border-radius: 10px;}