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 ...
随机推荐
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
- [IOS]vmxsmc.exe已停止工作 VMware11 Unlocker for Mac OSX无法使用的解决办法.
今天我帮同事安装VMware workstation12后发现之前的unlocker已经无法进行解锁了(就是VMware新建虚拟机无App Mac选项) 使用unlocker会出现vmsxmc.exe ...
- I题 hdu 1234 开门人和关门人
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1234 开门人和关门人 Time Limit: 2000/1000 MS (Java/Others) ...
- poj 1298 The Hardest Problem Ever
题目链接:http://poj.org/problem?id=1298 题目大意:按照所给的顺序要求将输入的字符串进行排列. #include <iostream> #include &l ...
- Select 使用不当引发的core,你应该知道的
排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...
- splay:优雅的区间暴力!
万年不更的blog主更新啦!主要是最近实在忙,好不容易才从划水做题的时间中抽出一段时间来写这篇blog 首先声明:这篇blog写的肯定会很基础...因为身为一个蒟蒻深知在茫茫大海中找到一个自己完全能够 ...
- 【Python项目】使用Face++的人脸识别detect API进行本地图片情绪识别并存入excel
准备工作 首先,需要在Face++的主页注册一个账号,在控制台去获取API Key和API Secret. 然后在本地文件夹准备好要进行情绪识别的图片/相片. 代码 介绍下所使用的第三方库 ——url ...
- Python基础===使用virtualenv创建一个新的运行环境
virtualenv简直是一个神器,以ubuntu环境为例, 先安装virtualenv 然后执行如下命令: 多版本创建env的方式: virtualenv 虚拟环境文件目录名 python=pyth ...
- SAE如何使用Git
了解Git及远程git仓库 请先看博文<Git入门及上传项目到github中>,弄懂了之后我相信我下面说的就相当于废话了. SAE的git远程仓库就相当于github. 向SAE的远程仓库 ...
- 【LabVIEW技巧】你可以不懂OOP,却不能不懂封装
前言 大多数写LabVIEW程序的工程师都不是一个纯软的工程师,很多做硬件的.做机械的.甚至学化学的也会学习LabVIEW. 由于主要重心不在软件,所以LabVIEW程序基本上能用行,也就得到入门容易 ...