题面在这里!

正式告别文化课回归的第一题QWQ,然鹅半个月之后还是要退役QWQWQWQWQ

好像很久之前就见过的一个题,当时只会打一打 O(N^2) 的暴力QWQ,正好今天又写了遍这个暴力用来对拍23333

正解的话就是把O(N^2)的暴力用数据结构优化一下。

(按照常规套路,先把树建成有根树,以1为根)

考虑把原问题建模,每条边的贡献就是这条边 i 的特征0/1数组的区间内不止一种数的区间数,特征数组a[]是指,如果点x在边i下面,那么a[x]=1;否则a[x]=0。

这个显然补集转化一下会更加简单,于是问题变成了如何快速的求每条边的特征数组的区间内只有一种数的区间数。。。。

明显具有可合并性嘛QWQ,直接把子树的一坨数组合并一下(因为1不可能重),然后把当前扫的根x的a[x]=1就行了。

直接合并还是O(N^2)的,不过改成线段树合并就只有N带log啦QWQ。。。。。

写之前搞清楚需要什么信息以及怎么合并就行啦(对于窝这种不爱写数据结构的老年养生选手来说还是写起来比较麻烦的QWQ)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define mid (l+r>>1)
#define LC lc[o]
#define RC rc[o]
const int N=100005,lg=37; int lc[N*lg],rc[N*lg],lt[N*lg],rt[N*lg],uu,vv;
int cnt,n,m,rot[N],llen[N*lg],rlen[N*lg];
int to[N*2],ne[N*2],hd[N],num=0,le,ri;
ll sum[N*lg],ans; inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;} inline void build(int L){
cnt++,lt[cnt]=rt[cnt]=0;
llen[cnt]=rlen[cnt]=L;
sum[cnt]=L*(ll)(L+1)>>1;
} inline void maintain(int o,int l,int r){
lt[o]=lt[LC],rt[o]=rt[RC];
llen[o]=llen[LC]+((llen[LC]==mid-l+1&&lt[LC]==lt[RC])?llen[RC]:0);
rlen[o]=rlen[RC]+((rlen[RC]==r-mid&&rt[RC]==rt[LC])?rlen[LC]:0);
sum[o]=sum[LC]+sum[RC]+(rt[LC]==lt[RC]?rlen[LC]*(ll)llen[RC]:0);
} void update(int o,int l,int r){
if(l==r){ sum[o]=llen[o]=rlen[o]=lt[o]=rt[o]=1; return;} if(!lc[o]) build(mid-l+1),lc[o]=cnt;
if(!rc[o]) build(r-mid),rc[o]=cnt; if(le<=mid) update(LC,l,mid);
else update(RC,mid+1,r); maintain(o,l,r);
} int Merge(int x,int y,int l,int r){
if(!x||!y) return x+y;
if(l==r||(!rc[x]&&!rc[y]&&!lc[x]&&!lc[y])) return lt[x]?x:y; if(lc[x]||lc[y]) lc[x]=Merge(lc[x],lc[y],l,mid);
if(rc[x]||rc[y]) rc[x]=Merge(rc[x],rc[y],mid+1,r); maintain(x,l,r);
return x;
} /*
void B(int o,int l,int r){
printf("%d %d %d %d %d %d %d %lld\n",o,l,r,lt[o],rt[o],llen[o],rlen[o],sum[o]); if(l==r) return; if(lc[o]) printf("%d is son of %d\n",lc[o],o),B(lc[o],l,mid);
if(rc[o]) printf("%d is son of %d\n",rc[o],o),B(rc[o],mid,r);
}
*/ void dfs(int x,int fa){
build(n),rot[x]=cnt; le=x,update(rot[x],1,n); for(int i=hd[x];i;i=ne[i])
if(to[i]!=fa) dfs(to[i],x),rot[x]=Merge(rot[x],rot[to[i]],1,n); if(fa) ans-=sum[rot[x]]; // if(x==4) B(rot[x],1,n);
} int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout); scanf("%d",&n),ans=(n-1)*(ll)(n+1)*(ll)n>>1;
for(int i=1;i<n;i++)
scanf("%d%d",&uu,&vv),add(uu,vv),add(vv,uu); dfs(1,0);
printf("%lld\n",ans); return 0;
}

  

HihoCoder - 1715 树的连通问题的更多相关文章

  1. hihocoder 1391 树状数组

    #1391 : Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, countr ...

  2. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  3. hihoCoder 1014trie树(字典树)

    hihoCoder 1014 题目提示已经很清楚了~ 贴代码…… #include <iostream> #include <cstdio> #include <cstr ...

  4. HihoCoder——Trie树

    本文出自:http://blog.csdn.net/svitter 原题:http://hihocoder.com/contest/hiho2/problem/1 题解:使用Trie树..基础题目.一 ...

  5. hihoCoder#1322(树的判定)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树. 输入 第一个是一个整数 T ,代表测试数据的组 ...

  6. HihoCoder 1511: 树的方差(prufer序)

    题意 对于一棵 \(n\) 个点的带标号无根树,设 \(d[i]\) 为点 \(i\) 的度数,定义一棵树的方差为数组 \(d[1..n]\) 的方差. 给定 \(n\) ,求所有带标号的 \(n\) ...

  7. #1014 : Trie树 HihoCoder(字典树)

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  8. hihocoder 1193 树堆 解题报告

    题目大意:给出一棵有根树(根为 \(0\) ),点有点权.可以删除点(非根),并将其子树接到其父亲上.我们称一个树为树堆当前仅当树上每个点都满足其权值大于等于其子树中所有点的点权.现在对于每个点要求其 ...

  9. 2015 北京网络赛 E Border Length hihoCoder 1231 树状数组 (2015-11-05 09:30)

    #1231 : Border Length 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Garlic-Counting Chicken is a special spe ...

随机推荐

  1. 20155335《java程序设计》第一周学习总结

    18个章节的问题 (1)为什么需要JVM让java跨平台? (2)JVM与JDK,与JRE的关系? (3)为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号 ...

  2. Desert King(POJ2728+最优比率生成树+二分)

    题目链接:http://poj.org/problem?id=2728 题目: 题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差. 思路: 由上图我们 ...

  3. [2009国家集训队]小Z的袜子(hose)(BZOJ2038+莫队入门题)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目: 题意:中文题意,大家都懂. 思路:莫队入门题.不过由于要去概率,所以我们假 ...

  4. 一个无线通信类投稿的期刊list

    转载一个,但是有些期刊的影响因子不是很对,要投的时候还是再到期刊主页上面看一看吧~ 期刊缩写 期刊全名 近年影响因子 P IEEE Proceedings Of The IEEE 3.686 IEEE ...

  5. linux irq 自动探测

    前言 编写驱动的时候,经常会用到中断,这时候我们在驱动初始化时就得申请中断,那么问题来了,中断号是多少呢?以前的中断号在板级相关的头文件里面已经静态定义好了,bsp的代码在内核启动过程也会根据那个帮我 ...

  6. python 命名规范最近遇到的问题

    1.remove redundant parentheses 出去多余的括号,写C#习惯了先加个括号,python的if不用加括号. 改为:if chrome_args().get("hea ...

  7. hadoop中setOutputKeyClass和setOutputValueClass里类型

    初学mapreduce programing,纠结一天的问题如下: job.setOutputKeyClass和job.setOutputValueClas在默认情况下是同时设置map阶段和reduc ...

  8. mongodb实现批量修改数据

    var rds = db.REGIPATIENTREC.find({mzh:{$lt:"0"},usrOrg:"石景山中西医结合医院"}); var show ...

  9. hive-group by的时候把两个字段变成map

    源表结构: pcgid               string mobilegid           string value               double 测试数据如下: p1 m1 ...

  10. 关于移动端audio自动播放问题

    本人小白全栈一枚,给公司写了一个监控中心,要求严重报警的时候需要触发音频播放,于是就有了以下的折腾. 刚开始一切都很顺利,自然而然的写了以下代码. <audio id="myaudio ...