HihoCoder - 1715 树的连通问题
正式告别文化课回归的第一题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&<[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 树的连通问题的更多相关文章
- hihocoder 1391 树状数组
#1391 : Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, countr ...
- DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...
- hihoCoder 1014trie树(字典树)
hihoCoder 1014 题目提示已经很清楚了~ 贴代码…… #include <iostream> #include <cstdio> #include <cstr ...
- HihoCoder——Trie树
本文出自:http://blog.csdn.net/svitter 原题:http://hihocoder.com/contest/hiho2/problem/1 题解:使用Trie树..基础题目.一 ...
- hihoCoder#1322(树的判定)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树. 输入 第一个是一个整数 T ,代表测试数据的组 ...
- HihoCoder 1511: 树的方差(prufer序)
题意 对于一棵 \(n\) 个点的带标号无根树,设 \(d[i]\) 为点 \(i\) 的度数,定义一棵树的方差为数组 \(d[1..n]\) 的方差. 给定 \(n\) ,求所有带标号的 \(n\) ...
- #1014 : Trie树 HihoCoder(字典树)
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- hihocoder 1193 树堆 解题报告
题目大意:给出一棵有根树(根为 \(0\) ),点有点权.可以删除点(非根),并将其子树接到其父亲上.我们称一个树为树堆当前仅当树上每个点都满足其权值大于等于其子树中所有点的点权.现在对于每个点要求其 ...
- 2015 北京网络赛 E Border Length hihoCoder 1231 树状数组 (2015-11-05 09:30)
#1231 : Border Length 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Garlic-Counting Chicken is a special spe ...
随机推荐
- Maven学习笔记(一)
我们暂且可以把Maven理解成是一个项目构建与依赖管理的工具 为什么选用maven? 约定(惯例)优先原则,默认限定了项目目录结构 提供三方依赖管理(解决了依赖维护的问题) 提供了一致的项目构建管 ...
- c语言中的size_t
size_t unsigned int 类型,无符号,它的取值没有负数.用来表示 参数/数组元素个数,sizeof 返回值,或 str相关函数返回的 size 或 长度.sizeof 操作符的结果类型 ...
- perl6中的替换
use v6; =begin pod perl6 中的替换用S/// S有几个可选参数: :g —(长形式::global)全局匹配:替换掉所有的出现 :i —不区分大小写的匹配 :ii —(长形式: ...
- 基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析
[转自:http://blog.chinaunix.net/uid-20543672-id-3195249.html] 在学习Linux内核驱动的时候,一开始就会碰到copy_from_use ...
- (转)LSI SAS 1068E Raid CentOS 5.5 安装实例浪潮NF5220系列 分类: linux
新来了一批服务器,全都是清一色的国产服务器,相同的阵列卡,令人头疼的是Linux标准内核不包含该raid驱动,需要单独安装,如果是新升级内核,肯定需要编译进去该raid驱动.一.先把主板自带的驱动光盘 ...
- 【bzoj4459】JSOI2013丢番图
某JSOI夏令营出题人啊,naive! 你还是得学习个,搬这种原题不得被我一眼看穿? 求个n^2的约数除以二,向上取整. #include<bits/stdc++.h> using nam ...
- BZOJ 4516: [Sdoi2016]生成魔咒——后缀数组、并查集
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4516 题意 一开始串为空,每次往串后面加一个字符,求本质不同的子串的个数,可以离线.即长度为 ...
- C11 标准特性研究
前言 - 需要点开头 C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准. 相比C99,C11有哪些变化呢!!所有的测试全部基于能够和标准贴合的特性平台. 但 ...
- 深度解析Python动态语言
1.动态语言的定义 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结 ...
- [linux]通过ssh远程设定各服务器时间,从而实现集群时间同步
#!/usr/bin/env bash #all hosts should to sync time, all hosts should no password login echo other sy ...