[ZJOI2015][bzoj3924] 幻想乡战略游戏 [动态点分治]
唉:-(动态点分治的思想真是复杂......
先码住,再做几道题再来填坑
PS:接下来的Code因为用了倍增lca所以TLE一部分,但是懒得改成RMQ了......
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,cnt,sum,root,first[],fa[],siz[],son[];
bool vis[]={};
ll dis1[],dis2[],tot[];
struct edge{
int to,next,w;
}a[];
void add(int u,int v,int w){
a[++cnt]=(edge){v,first[u],w};first[u]=cnt;
a[++cnt]=(edge){u,first[v],w};first[v]=cnt;
}
inline int _max(int l,int r){return (l>r)?l:r;}
inline int _min(int l,int r){return (l<r)?l:r;}
inline void _swap(int &l,int &r){l^=r;r^=l;l^=r;}
struct Original_Tree{
int cnt,First[],dis[],dep[];
int st[][];
struct Edge{int to,next,w;}A[];
void add(int u,int v,int w){
A[++cnt]=(Edge){v,First[u],w};First[u]=cnt;
A[++cnt]=(Edge){u,First[v],w};First[v]=cnt;
}
void ddfs(int u,int f){
st[u][]=f;int i,v;
//cout<<"dfs "<<u<<" "<<f<<" "<<dis[u]<<" "<<dep[u]<<"\n";
for(i=First[u];~i;i=A[i].next){
v=A[i].to;
if(v==f) continue;
dis[v]=dis[u]+A[i].w;dep[v]=dep[u]+;
ddfs(v,u);
}
}
void initst(){
dis[]=;dep[]=;ddfs(,);int i,j;
for(j=;j<;j++){
for(i=;i<=n;i++) st[i][j]=st[st[i][j-]][j-];
}
//for(i=1;i<=n;i++){
//for(j=0;j<=3;j++) cout<<st[i][j]<<" ";
//cout<<"\n";
//}
}
int getdis(int u,int v){
if(dep[u]>dep[v]) _swap(u,v);
int i,lca,tu=u,tv=v;
//cout<<"begin "<<u<<" "<<v<<"\n";
for(i=;i>=;i--)
if(dep[st[v][i]]>=dep[u]) v=st[v][i];
//cout<<"half finish "<<u<<" "<<v<<"\n";
if(u==v) return dis[tv]-dis[u];
for(i=;i>=;i--)
if(st[u][i]!=st[v][i]){
u=st[u][i];
v=st[v][i];
}
lca=st[u][];
//cout<<"getdis "<<tu<<" "<<tv<<" "<<lca<<"\n";
return dis[tu]+dis[tv]-*dis[lca];
}
}T;
void getroot(int u,int f){
int i,v;siz[u]=;son[u]=;
for(i=T.First[u];~i;i=T.A[i].next){
v=T.A[i].to;
if(v==f||vis[v]) continue;
getroot(v,u);
siz[u]+=siz[v];son[u]=_max(son[u],siz[v]);
}
son[u]=_max(son[u],sum-siz[u]);
if(son[u]<son[root]) root=u;
}
void dfs(int u,int f){
int i,v;vis[u]=;fa[u]=f;
for(i=T.First[u];~i;i=T.A[i].next){
v=T.A[i].to;
if(vis[v]) continue;
sum=siz[v];root=;
getroot(v,);add(u,root,v);
dfs(root,u);
}
}
void change(int u,int delta){
tot[u]+=delta;int v,dis;
for(v=u;fa[v];v=fa[v]){
dis=T.getdis(u,fa[v]);
dis1[fa[v]]+=(ll)dis*delta;
dis2[v]+=(ll)dis*delta;
tot[fa[v]]+=delta;
}
}
ll calc(int u){
ll re=dis1[u];int i,dis;
for(i=u;fa[i];i=fa[i]){
dis=T.getdis(u,fa[i]);
re+=dis1[fa[i]]-dis2[i];
re+=dis*(tot[fa[i]]-tot[i]);
}
return re;
}
ll query(int u){
ll re=calc(u),tmp;int i,v;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
tmp=calc(a[i].w);
if(tmp<re) return query(v);
}
return re;
}
int main(){
freopen("zjoi15_tree4.in","r",stdin);
freopen("zjoi15_tree.out","w",stdout); memset(tot,,sizeof(tot));
memset(dis1,,sizeof(dis1));
memset(dis2,,sizeof(dis2));
memset(first,-,sizeof(first));
memset(T.First,-,sizeof(T.First));
int i,t1,t2,t3,tmp;
n=read();m=read();
for(i=;i<n;i++){
t1=read();t2=read();t3=read();
T.add(t1,t2,t3);
}
T.initst();
sum=son[]=n;root=;
getroot(,);tmp=root;
dfs(root,);root=tmp;
for(i=;i<=m;i++){
t1=read();t2=read();
change(t1,t2);
printf("%lld\n",query(root));
}
}
[ZJOI2015][bzoj3924] 幻想乡战略游戏 [动态点分治]的更多相关文章
- loj 2135 「ZJOI2015」幻想乡战略游戏 - 动态点分治
题目传送门 传送门 题目大意 给定一棵树,初始点权都为0,要求支持: 修改点权 询问带权重心 询问带权重心就在点分树上跑一下就行了.(枚举跳哪个子树更优) 剩下都是基础点分治. 学了一下11-dime ...
- 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治
[BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)
题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...
- 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治
题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...
- P3345 [ZJOI2015]幻想乡战略游戏 动态点分治
\(\color{#0066ff}{ 题目描述 }\) 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越 ...
- ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完
Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...
- BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)
这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...
- 洛谷P3345 [ZJOI2015]幻想乡战略游戏 [动态点分治]
传送门 调了两个小时,终于过了-- 凭啥人家代码80行我180行啊!!! 谁叫你大括号换行 谁叫你写缺省源 思路 显然,补给点所在的位置就是这棵树的带权重心. 考虑size已知时如何找重心:一开始设答 ...
随机推荐
- SummerVocation_Leaning--java动态绑定(多态)
概念: 动态绑定:在执行期间(非编译期间)判断所引用的对象的实际类型,根据实际类型调用其相应的方法.如下例程序中,根据person对象的成员变量pet所引用的不同的实际类型调用相应的方法. 具体实现好 ...
- 可拖拽div
在开发的时候需要一个可拖拽的prompt弹框.自己写了一个,大概思路为: 1.获取鼠标左键按下移动的起点坐标(x,y). 2.获取div的left和top属性. 3.得到鼠标坐标到左上角的距离(x-t ...
- Redis常用诊断命令
1.info 命令查看redis信息,可以指定要查看的section名 sections:Server,clients,memory,persistence,stats,replication,cpu ...
- mongodb添加管理员密码
use admin db.createUser( { user: "adminUser", pwd: "adminPass", roles: [ { role: ...
- thinkcmf5 学习笔记
1.api里如何传递页码和每页记录数 data :{category_id: '{$category.id}',page:++count+',10'}, page参数传递页码+数量,例如 ...
- tp3.2读取time()格式遇到的的问题(尚未解决)
在用tp3.2框架做一个讲座模块.最近又遇到了一个问题 如上图所示,我把日期和讲座开始时间结束时间分来放了.(这里的Jdate2和jdate3本来存放为time(7)类型的,后发现在原来这个7是可以改 ...
- PHP switch问题
$a = 0; switch($a){ case $a > 7: echo 234; break; case $a > 2: echo 4556; break; default: echo ...
- CentOS下安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64
因为服务器缺少php gd库,因为系统是centos,就是用yum去安装,一安装就报错如下: [root@iZ28sdxghs2Z ~]# yum install php-gd Loaded plug ...
- 精通SpringBoot--Spring事件 Application Event
Spring的事件为Bean与Bean之间的通信提供了支持,当我们系统中某个Spring管理的Bean处理完某件事后,希望让其他Bean收到通知并作出相应的处理,这时可以让其他Bean监听当前这个Be ...
- 动态规划:HDU1087-Super Jumping! Jumping! Jumping!(最大上升子序列和)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...