BZOJ3924——[Zjoi2015]幻想乡战略游戏
0、题意:动态维护带权中心
1、分析:妈的,这题做了一天,mdzzzzzzzzzzzzzzzzzz…..
这个题是边权,我们首先要将边权转化成点权。。。
我们维护一个分支结构中到根的距离和,一个分支结构中到分支中心的距离和,这个分支结构中所有的军队总量,lca…,lca这个预处理出来,因为要求树上两点距离
询问到一个点的距离时(下面称query值),我们在logn个分治结构中询问答案
到x点的答案=x本身子树到这个点答案,然后我们向上跳
每次跳我们将答案+=father[x]的除了x这个子树的点到father[x]的值+这些点的value*father[x]到x的值。。口胡了一番。。具体看代码吧
修改的时候,也是修改logn个分支结构,我们依旧是随便的修改一下就可以了
然后在真正的询问怎么办呢?我们logn的搞一下,怎么搞呢?我们贪心
如果这个子树中的根的query值<这个根的query,那么我们就一下子跳到这个子树中的分支中心去,可以想象,我们要找的点必然在这个子树中。
我们最多会跳logn次,每次我们查询query值是O(logn)的,所以询问的时间复杂度是O(log2n),修改的时间复杂度是O(logn),总的复杂度O(nlog2n)
代码改了一天QAQ
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
#define M 200010
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
struct Edge{
int u, v;
LL w;
int next;
} G[M];
int head[M], tot;
int size[M], mx[M], mi, root;
int ok[M];
int father[M];
LL fadis[M], dis;
LL ft[M];
LL s1[M], s2[M], val[M];
int fenzhi[M][20], ding[M];
int vis[M];
int n, Q;
int zz[M], ztot;
int ftt[M][20];
LL ff[M][20];
int height[M];
LL dep[M];
int pa[M];
inline void add(int u, int v, LL w){
G[++ tot] = (Edge){u, v, w, head[u]};
head[u] = tot;
}
inline void dfs(int x, int fa, int h, LL gh){
height[x] = h;
dep[x] = gh;
ftt[x][0] = fa;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa){
dfs(G[i].v, x, h + 1, gh + G[i].w);
}
}
inline int lca(int x, int y){
if(height[x] < height[y]) swap(x, y);
int t = height[x] - height[y];
for(int i = 18; i >= 0; i --){
if(t & (1 << i)){
x = ftt[x][i];
}
}
if(x == y) return x;
for(int i = 18; i >= 0; i --){
if(ftt[x][i] != ftt[y][i]){
x = ftt[x][i];
y = ftt[y][i];
}
}
return ftt[x][0];
}
inline void init(){
for(int i = 1; i <= 18; i ++){
for(int j = 1; j <= n; j ++){
ftt[j][i] = ftt[ftt[j][i - 1]][i - 1];
}
}
for(int i = 1; i <= n; i ++){
int o = i, cnt = 0;
while(o){
int LCA = lca(o, i);
LL od = dep[i] + dep[o] - 2 * dep[LCA];
ff[i][cnt] = od;
o = father[o];
cnt ++;
}
}
}
inline void dfssize(int x, int fa){
size[x] = 1; mx[x] = 0;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa && !ok[G[i].v]){
dfssize(G[i].v, x);
size[x] += size[G[i].v];
if(size[G[i].v] > mx[x]) mx[x] = size[G[i].v];
}
}
inline int getroot(int r, int x, int fa, LL d){
mx[x] = max(mx[x], size[r] - size[x]);
if(mx[x] < mi) mi = mx[x], root = x, dis = d;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa && !ok[G[i].v]){
getroot(r, G[i].v, x, d + G[i].w);
}
}
inline int solve(int x, int fa, LL d, int otot){
mi = n; dfssize(x, 0);
getroot(x, x, 0, 0);
ok[root] = 1;
father[root] = fa;
int op = root;
dis += d;
fadis[root] = dis;
LL tt = dis;
for(int i = head[root]; i != -1; i = G[i].next) if(!ok[G[i].v]){
int wt = solve(G[i].v, op, G[i].w, otot + 1);
ft[wt] = G[i].w;
fenzhi[G[i].v][otot] = wt;
ding[wt] = G[i].v;
}
return op;
}
inline LL query(int x){
LL ret = s1[x];
int o = x;
int cnt = 1;
while(father[o]){
ret += (s1[father[o]] - (s2[o] + ft[o] * val[o]) + (val[father[o]] - val[o]) * ff[x][cnt]);
o = father[o];
cnt ++;
}
return ret;
}
inline int Query(int rt, int fa, int otot){
LL yy = query(rt);
for(int i = head[rt]; i != -1; i = G[i].next) if(fenzhi[G[i].v][otot] != fa){
LL y = query(G[i].v);
if(yy > y) return Query(fenzhi[G[i].v][otot], rt, otot + 1);
}
int x = rt;
return x;
}
inline int change(int x, int y, int rt){
int o = father[x];
int cnt = 1;
val[x] += y;
s2[x] += (ff[x][cnt] - ft[x]) * y;
while(o){
s1[o] += (ff[x][cnt]) * y;
s2[o] += (ff[x][cnt + 1] - ft[o]) * y;
val[o] += y;
o = father[o];
cnt ++;
}
int ret = Query(rt, 0, 0);
return ret;
}
int main(){
n = read(), Q = read();
memset(head, -1, sizeof(head));
for(int i = 1; i < n; i ++){
int u = read(), v = read();
LL w = (LL)read();
add(u, v, w); add(v, u, w);
}
dfs(1, 0, 0, 0);
int rt = solve(1, 0, 0, 0); fadis[rt] = 0;
init();
for(int i = 1; i <= Q; i ++){
int u = read();
LL e = read();
printf("%lld\n", query(change(u, e, rt)));
}
return 0;
}
BZOJ3924——[Zjoi2015]幻想乡战略游戏的更多相关文章
- BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】
BZOJ3924 ZJOI2015 幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂 ...
- bzoj3924 [Zjoi2015]幻想乡战略游戏 点分树,动态点分
[BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...
- BZOJ3924 [Zjoi2015]幻想乡战略游戏
Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...
- [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)
题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...
- 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治
[BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...
- 【BZOJ3924】幻想乡战略游戏(动态点分治)
[BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...
- 洛谷 P3345 [ZJOI2015]幻想乡战略游戏 解题报告
P3345 [ZJOI2015]幻想乡战略游戏 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做 ...
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345
[ZJOI2015]幻想乡战略游戏 思路: 树剖暴力转移: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
随机推荐
- JAVA内存机制
Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...
- CSS3的transition动画功能
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- BZOJ4590: [Shoi2015]自动刷题机
显然看着就是二分,仔细看的话显然刷的题数随n增大单调不升. 挂了一发是因为无解输出一个-1而不是两个…… #include<cstdio> #include<algorithm> ...
- Spring-data-jpa 的@modifying注解
在项目的进行中需要通过 @Modifying 注解完成修改操作(注意:不支持新增) 1.之前有一个业务需要先查询一个结果集,然后将满足结果集中某个条件的另外一张表中的字段做一个属性值的更改,这个更改可 ...
- lua 闭包
--匿名函数使用upvalue i保存他的计数, 闭包是一个函数加上它可以正确访问的upvalues function newCounter() return function() i = i + r ...
- 9月8日HTML表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- Java关键字——static
static申明属性 如果有属性希望被所有对象共享,则必须将其申明为static属性. 使用static声明属性,则此属性称为全局属性,有时候也称为静态属性. 当一个类的属性申明位static的时候, ...
- CodeForces 459A Pashmak and Garden(水~几何-给两点求两点组成正方形)
题目链接:http://codeforces.com/problemset/problem/459/A 题目大意: 给出两个点(在坐标轴中),求另外两个点从而构成一个正方形,该正方形与坐标轴平行. 如 ...
- TortoiseSVN的相关问题
图标覆盖问题: 创建一个保存文档的目录,创建一个工作目录,工作目录创建后,没有显示覆盖图标.解决办法如下: 找到设置,在工作目录下右键 打开界面如下: 从包含路径中设置就可以. 目录检出后把它从检出状 ...
- 初识Python类
吐槽:学习面向对象就像你追一个女神一样,刚刚有点感觉了,过几天又陷入绝望的感觉,很蛋疼. 类的语法 class Person(object): print("learning class&q ...