题意:给出$N$个点的一棵树,现在将距离为$2$的点之间连一条边,求所有点对之间最短路的和,$N \leq 10^5$

一道树上乱搞题搞得我点分治调了一个小时$QAQ$
点分治中唯一需要注意的是:统计答案时因为长度为奇数的路线除二后要向上取整,所以要在计算时加上路径长度为奇数的路径数量
点分治都是模板题,会一个就全会了$qwq$
#include<bits/stdc++.h>
#define MAXN 200010
#define int long long
using namespace std;

struct Edge{
    int end , upEd;
}Ed[MAXN << ];
long long head[MAXN] , size[MAXN] , N , minSize , minDir , nowSize , cntEd;
long long ans;
bool vis[MAXN];

inline void addEd(int a , int b){
    Ed[++cntEd].end = b;
     Ed[cntEd].upEd = head[a];
     head[a] = cntEd;
}

//求当前子树大小
void getNowSize(int dir){
     vis[dir] = ;
     nowSize++;
     for(int i = head[dir] ; i ; i = Ed[i].upEd)
         if(!vis[Ed[i].end])
            getNowSize(Ed[i].end);
    vis[dir] = ;
}

//求重心
void getZX(int dir){
    vis[dir] = size[dir] = ;
    ;
    for(int i = head[dir] ; i ; i = Ed[i].upEd)
        if(!vis[Ed[i].end]){
            getZX(Ed[i].end);
            size[dir] += size[Ed[i].end];
            maxSize = max(maxSize , size[Ed[i].end]);
        }
    maxSize = max(maxSize , nowSize - size[dir]);
    if(maxSize < minSize){
        minSize = maxSize;
        minDir = dir;
    }
    vis[dir] = ;
}

//算答案
pair < long long , long long > calAns(int dir , int dep){
    vis[dir] = ;
    ans += dep +  >> ;
    nowSize++;
    pair < );
    for(int i = head[dir] ; i ; i = Ed[i].upEd)
        if(!vis[Ed[i].end]){
            pair < );
            q.first += t.first;
            q.second += t.second;
        }
    vis[dir] = ;
    return q;
}

void work(int dir){
    nowSize = ;
    getNowSize(dir);
    minSize = nowSize;
    getZX(dir);
     , culJi =  , culOu = ;
    vis[t] = ;
    nowSize = ;
    for(int i = head[t] ; i ; i = Ed[i].upEd)
        if(!vis[Ed[i].end]){
            int k = nowSize;
            //注意答案统计!
            pair < );
            ans += (sum * (nowSize - k) + t.first * k + t.second * culOu + culJi * (nowSize - k - t.second)) >> ;
            sum += t.first;
            culJi += t.second;
            culOu += nowSize - k - t.second;
        }
    for(int i = head[t] ; i ; i = Ed[i].upEd)
        if(!vis[Ed[i].end])
            work(Ed[i].end);
}

signed main(){
  ios::sync_with_stdio();
    cin >> N;
     ; i < N ; i++){
        int a , b;
        cin >> a >> b;
        addEd(a , b);
        addEd(b , a);
    }
    work();
    cout << ans;
    ;
}

CF1060E Sergey and Subways 假的点分治的更多相关文章

  1. CF1060E Sergey and Subway(点分治)

    给出一颗$N$个节点的树,现在我们**在原图中**每个不直接连边但是中间只间隔一个点的两个点之间连一条边. 比如**在原图中**$u$与$v$连边,$v$与$w$连边,但是$u$与$w$不连边,这时候 ...

  2. [CF1060E]Sergey and Subway[树dp]

    题意 给出 \(n\) 个点的树,求 \(\sum_{i=1}^n{\sum_{j=i}^n{\lceil \frac{dis(i,j)}{2} \rceil}}\) . \(n\leq 2 \tim ...

  3. CF1060E Sergey and Subway 思维

    分两种情况讨论 一种为奇数长为$L$的路径,在经过变化后,我们需要走$\frac{L}{2} + 1$步 一种为偶数长为$L$的路径,在变化后,我们需要走$\frac{L}{2}$步 那么,我们只需要 ...

  4. cf1060E. Sergey and Subway(树形dp)

    题意 题目链接 Sol 很套路的题 直接考虑每个边的贡献,最后再把奇数点的贡献算上 #include<bits/stdc++.h> #define Pair pair<int, in ...

  5. 【BZOJ3697】采药人的路径 点分治

    [BZOJ3697]采药人的路径 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是 ...

  6. BZOJ3697:采药人的路径(点分治)

    Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天都要进行采药 ...

  7. 【BZOJ3451】Tyvj1953 Normal - 点分治+FFT

    题目来源:NOI2019模拟测试赛(七) 非原题面,题意有略微区别 题意: 吐槽: 心态崩了. 好不容易场上想出一题正解,写了三个小时结果写了个假的点分治,卡成$O(n^2)$ 我退役吧. 题解: 原 ...

  8. 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)

    Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...

  9. BZOJ4182 Shopping(点分治+树形dp)

    点分治,每次考虑包含根的连通块,做树形多重背包即可,dfs序优化.注意题面给的di范围是假的,坑了我0.5h,心态炸了. #include<iostream> #include<cs ...

随机推荐

  1. npm install权限问题,报错:permission denied。

    1.部署gulp项目时,nodeJs和gulp都已经正确安装,在项目内部执行npm install命令时,有些gulp的插件一直下载不成功,报错几种以下错误: “gulp-imagemin: Coul ...

  2. Ansible--原理

    什么是Ansible Ansible是一种IT自动化运维工具,它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署或者是零停机滚动更新Ansible是新出现的自动化运维工具,基于Python ...

  3. Sql Server 增加字段、修改字段、修改类型、修改默认值

    1.修改字段名: alter table 表名 rename column A to B 2.修改字段类型: alter table 表名 alter column 字段名 type not null ...

  4. C#语言————第四章 深入C#的String类

    *********类型转换**************** Convert与Parse的区别: Convert可以将任何内置类型转换为其他任何内置类型 XX.Parse:只能将字符串转换为XX类型例如 ...

  5. 安全之路 —— 无DLL文件实现远程线程注入

    简介         在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...

  6. 点击eclipse包报错

    每次只要新建一个package包,或者鼠标选择某个package包,系统就会提示:An error has occurred. See error log for more details. org/ ...

  7. Linux 小知识翻译 - 「端口限制」

    上次说了端口号相关的内容,这次聊聊「端口限制」的事. 经常看到关于安全的书籍上会说「不要开放多余的端口」,那么,如何限制端口才好呢? 实际,端口限制的方法大体上分的话有2种. 其一,「通过应用程序来处 ...

  8. beta版本汇总

    deta版本五天汇总 day1 day2 day3 day4 day5 GitHub地址 前端代码github地址 后端代码github地址 这里说明一下我们队伍的安排风格: 第一天:明确安排前后端的 ...

  9. swift语言混编--语言交互的接口

    FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the ...

  10. 路由器不重启,是否ip就永远不变

    今天发现公司的公网ip突然变了,没有人去动过路由器怎么会这样呢?经查原因如下:1.不一定,IP变化是每一次拨号重新获取的.2.路由器重启了,会自动拨号,获得IP3.但如果说因各种原因,掉线,路由器也会 ...