5060. 公路建设
来源:互联网 发布:上海网络交换机回收 编辑:程序博客网 时间:2024/06/16 20:29
题目大意
给定
有
Data Constraint
题解
考虑对边建线段树,每个区间维护在最小生成森林上的边,显然最多只有
然后每次合并区间就直接用
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std ;#define N 100000 + 10typedef long long ll ;struct Edge { int u , v , w ;} E[N] ;struct Tree { vector < int > e ;} T[4*N] ;vector < int > tp ;int fa[N] ;int n , m , Q ;int Get( int x ) { return fa[x] == x ? x : fa[x] = Get(fa[x]) ; }void Merge( int l , int r ) { tp.clear() ; int h1 = 0 , h2 = 0 ; int siz1 = T[l].e.size() , siz2 = T[r].e.size() ; while ( h1 < siz1 || h2 < siz2 ) { if ( h1 < siz1 && h2 < siz2 ) { if ( E[T[l].e[h1]].w < E[T[r].e[h2]].w ) { tp.push_back(T[l].e[h1]) ; h1 ++ ; } else { tp.push_back(T[r].e[h2]) ; h2 ++ ; } } else { if ( h1 < siz1 ) { tp.push_back(T[l].e[h1]) ; h1 ++ ; } else { tp.push_back(T[r].e[h2]) ; h2 ++ ; } } }}void Kruskal( int now ) { T[now].e.clear() ; for (int i = 1 ; i <= n ; i ++ ) fa[i] = i ; for (int i = 0 ; i < (signed)tp.size() ; i ++ ) { int u = E[tp[i]].u , v = E[tp[i]].v ; int fx = Get(u) ; int fy = Get(v) ; if ( fx != fy ) { T[now].e.push_back(tp[i]) ; fa[fx] = fy ; } }}void Build( int v , int l , int r ) { if ( l == r ) { T[v].e.push_back(l) ; return ; } int mid = (l + r) >> 1 ; Build( v + v , l , mid ) ; Build( v + v + 1 , mid + 1 , r ) ; Merge( v + v , v + v + 1 ) ; Kruskal( v ) ;}void Search( int v , int l , int r , int x , int y ) { if ( l == x && r == y ) { Merge( 0 , v ) ; Kruskal(0) ; return ; } int mid = (l + r) >> 1 ; if ( y <= mid ) Search( v + v , l , mid , x , y ) ; else if ( x > mid ) Search( v + v + 1 , mid + 1 , r , x , y ) ; else { Search( v + v , l , mid , x , mid ) ; Search( v + v + 1 , mid + 1 , r , mid + 1 , y ) ; }}int main() { freopen( "highway.in" , "r" , stdin ) ; freopen( "highway.out" , "w" , stdout ) ; scanf( "%d%d%d" , &n , &m , &Q ) ; for (int i = 1 ; i <= m ; i ++ ) scanf( "%d%d%d" , &E[i].u , &E[i].v , &E[i].w ) ; Build( 1 , 1 , m ) ; for (int i = 1 ; i <= Q ; i ++ ) { int l , r ; scanf( "%d%d" , &l , &r ) ; T[0].e.clear() ; Search( 1 , 1 , m , l , r ) ; ll ans = 0 ; for (int i = 0 ; i < (signed)T[0].e.size() ; i ++ ) ans += E[T[0].e[i]].w ; printf( "%lld\n" , ans ) ; } return 0 ;}
以上.
0 0
- 5060. 公路建设
- [JZOJ5060]公路建设
- jzoj 5060. 【GDOI2017第二轮模拟day1】公路建设 线段树+最小生成树
- 【公路建设】解题报告
- 【GDOI2017第二轮模拟day1】公路建设
- 【JZOJ5060】【GDOI2017第二轮模拟day1】公路建设
- 【Kruskal】公路建设(Road.exe, 1s, 64M)
- 【jzoj5060】【GDOI2017第二轮模拟day1】【公路建设】【数据结构】
- 【GDOI2017第二轮模拟day1】公路建设(克鲁斯卡尔最小生成树+线段树+归并)
- OkHttp Wiki翻译(二)调用
- 栅格系统的Gutter vs Offset vs Pull vs Push
- C语言的数据存储
- POJ 2409-Let it Bead(Polya定理-旋转+翻转 串项链)
- Java Rest WebService 三步服务发布
- 5060. 公路建设
- 完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
- Centos7安装后重启出现Initial setup of CentOS Linux 7 (core)
- PAT 1001. A+B Format (20)
- java动态代理和静态代理
- wordcount程序卡住了
- Linux学习笔记14
- MySQL数据库(6)
- 知识小结