题意:给出$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. 《ASP.NET MVC企业实战》(一) MVC开发前奏

    一.工具和方法 学到了一些没用过的工具和方法: a)删除多余的using指令并排序:一个类头部的using一般会有很多用不到的,在完成类的编写后,可以右键选择”组织using”来删除没用的using并 ...

  2. linux网络 skb_buff

    sbk_buff中的data_len指的是尾部带的page数据的长度,len指的是总共的data的长度,len-data_len是第一个线性buf的数据长度. sk_buff->len:表示当前 ...

  3. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  4. python 定时修改数据库

    当需要定时修改数据库时,一般我们都选择起一个定时进程去改库.如果将这种定时任务写入业务中,写成一个接口呢,定时进程显得有些不太合适?如果需要定时修改100次数据库,常规做法会启动100个进程,虽然这种 ...

  5. 自己写bitmap

    备注:1.原创文章,转载请标明出处: 2.欢迎建议和意见 3.我的实现是C语言,为了保护公司隐私,下述数据类型被我改了.实际上int应改是无符号4个字节的类型,byte是有符号1个字节,才能保证移植性 ...

  6. 【redis专题(4)】命令语法介绍之sorted_set

    有序集合可以模拟优先级队列的实现 增 zadd key score1 value1 score2 value2 .. redis 127.0.0.1:6379> zadd stu 18 lily ...

  7. Unity LayerMask 的位运算

    Unity的Layer Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位. 0000 0000 0000 0000 0000 0000 0000 0000 31 ...

  8. CTR预估中GBDT与LR融合方案

    1. 背景 CTR预估(Click-Through Rate Prediction)是互联网计算广告中的关键环节,预估准确性直接影响公司广告收入.CTR预估中用的最多的模型是LR(Logistic R ...

  9. <!DOCTYPE>标签与table高度100% (转)

    <!DOCTYPE>标签可声明三种DTD类型,分别表示严格版本.过渡版本以及基于框架的 HTML 文档. 三种HTML文档类型: HTML 4.01 规定了三种文档类型:Strict.Tr ...

  10. Alpha冲刺! Day8 - 砍柴

    Alpha冲刺! Day8 - 砍柴 今日已完成 晨瑶:写了部分gitkraken团队协作教程:讨论关于继承baseActivity因为需要参数无法通过override去实现函数,并且initData ...