[Lydsy2017省队十连测]公路建设

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 93  Solved: 53
[Submit][Status][Discuss]

Description

在Byteland一共有n个城市,编号依次为1到n,它们之间计划修建m条双向道路,其中修建第i条道路的费用为ci。B
yteasar作为Byteland公路建设项目的总工程师,他决定选定一个区间[l,r],仅使用编号在该区间内的道路。他希
望选择一些道路去修建,使得连通块的个数尽量少,同时,他不喜欢修建多余的道路,因此每个连通块都可以看成
一棵树的结构。为了选出最佳的区间, Byteasar会不断选择 q个区间,请写一个程序,帮助 Byteasar计算每个区
间内修建公路的最小总费用。 

Input

第一行包含三个正整数n; m; q,表示城市数、道路数和询问数。
接下来m 行,每行三个正整数ui; vi; ci,表示一条连接城市ui 和vi 的双向道路,费用为ci。
接下来q 行,每行两个正整数li; ri,表示一个询问。
1 ≤ ui, vi ≤ n, ui ̸= vi, 1 ≤ li ≤ ri ≤ m, 1 ≤ ci ≤ 10^6
N<=100,M<=100000,Q<=15000
 

Output

输出q 行,每行一个整数,即最小总费用。
 

Sample Input

3 5 2
1 3 2
2 3 1
2 1 6
3 1 7
2 3 7
2 5
3 4

Sample Output

7
13

HINT

 
题解:因为点数极少所以有用的边只有n-1条,因为最小生成树,
   所以线段树每个节点维护的边只需要有用的那几条就可以了。
 #include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath> #define N 107
#define M 100007
#define ls p<<1
#define rs p<<1|1
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,q;
int fz[M],fa[N];
struct Data
{
int x,y,z;
}a[M];
struct Node
{
int sum,a[N];
void init()
{
sum=;
memset(a,,sizeof(a));
}
}tr[M<<],ans; int find(int x)
{
if (fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
Node merge(Node y,Node z)
{
Node x;x.init();
int i=,j=,k=,op=;
while(a[y.a[i]].z&&a[z.a[j]].z)
if (a[y.a[i]].z<a[z.a[j]].z) fz[++k]=y.a[i++];
else fz[++k]=z.a[j++];
while(a[y.a[i]].z) fz[++k]=y.a[i++];
while(a[z.a[j]].z) fz[++k]=z.a[j++];
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=k;i++)
{
int u=find(a[fz[i]].x),v=find(a[fz[i]].y);
if (u!=v)
{
fa[u]=v;
x.sum+=a[fz[i]].z,x.a[++op]=fz[i];
}
}
return x;
}
void build(int p,int l,int r)
{
if (l==r)
{
tr[p].sum=a[l].z;
tr[p].a[]=l;
return;
}
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
tr[p]=merge(tr[ls],tr[rs]);
}
Node tree_find(int p,int l,int r,int x,int y)
{
if (l==x&&r==y) return tr[p];
int mid=(l+r)>>;
if (y<=mid) return tree_find(ls,l,mid,x,y);
else if (x>mid) return tree_find(rs,mid+,r,x,y);
else return merge(tree_find(ls,l,mid,x,mid),tree_find(rs,mid+,r,mid+,y));
}
int main()
{
n=read(),m=read(),q=read();
for (int i=;i<=m;i++)
a[i].x=read(),a[i].y=read(),a[i].z=read();
build(,,m);
while(q--)
{
int l=read(),r=read();
ans=tree_find(,,m,l,r);
printf("%d\n",ans.sum);
}
}
 

bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树的更多相关文章

  1. bzoj 5216: [Lydsy2017省队十连测]公路建设

    5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 66  Solved: 37[Submit][St ...

  2. bzoj5216: [Lydsy2017省队十连测]公路建设

    题目思路挺巧妙的. 感觉应该可以数据结构一波,发现n很小可以搞搞事啊.然后又发现给了512mb,顿时萌生大力线段树记录的念头 一开始想的是记录节点的fa,然后发现搞不动啊?? 但其实边肯定最多只有n- ...

  3. bzoj 5218: [Lydsy2017省队十连测]友好城市

    题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用 ...

  4. bzoj 5217: [Lydsy2017省队十连测]航海舰队

    Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ...

  5. BZOJ 5215: [Lydsy2017省队十连测]商店购物

    裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ...

  6. @bzoj - 5219@ [Lydsy2017省队十连测]最长路径

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在Byteland一共有n个城市,编号依次为1到n,形成一个n个 ...

  7. Lydsy2017省队十连测

    5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...

  8. 【BZOJ 5222】[Lydsy2017省队十连测]怪题

    题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...

  9. 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)

    传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...

随机推荐

  1. 单元测试模块unittest使用学习

    工作原理: unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 一个TestCase的实例就是一个测试用例.什么是 ...

  2. leetcode个人题解——#18 4sums

    在3sums的基础上加了一层循环. class Solution { public: vector<vector<int>> fourSum(vector<int> ...

  3. 十六:The YARN Service Registry

    yarn 服务注册功能是让长期运行的程序注册为服务一直运行. yarn中运行的程序分为两类,一类是短程序,一类一直运行的长程序.第二种也称为服务.yarn服务注册就是让应用程序能把自己注册为服务,如h ...

  4. 【树莓派 Raspberry-Pi 】系统安装及一些必要的配置

    上周六刚收到我的小电脑,被无线设置卡住了,文章并非原创,参考了几个朋友的折腾经历,自己整理下备忘,也希望能帮到和我一样在树莓派方面小白的人,也希望可以和更多有这方面兴趣的朋友共同交流 0. 操作系统下 ...

  5. 又见CLOSE_WAIT

    原文: http://mp.weixin.qq.com/s?__biz=MzI4MjA4ODU0Ng==&mid=402163560&idx=1&sn=5269044286ce ...

  6. 使用HTML5制作时钟

    之前看到别人用HTML5制作时钟,自己也写了一个,这是很久以前写的了,没有注释,现在自己看都晕了(注释的重要性就体现在这边了),找时间加上注释,让自己和别人都比较好理解. <!DOCTYPE h ...

  7. 关于GenericJDBCException的问题

    在spring和hibernate整合的初步阶段,还没有编辑hibernate.cfg.xml这个文件,只有一个beans.xml文件.此时遇到了一个bug. Exception in thread ...

  8. eg_2

    2. 编写一个程序,输出在一个字符串中,指定的字符串出现的次数 第一种方法: public class Test { public static void main(String[] args) { ...

  9. WebService部署服务器调试时提示 “测试窗体只能用于来自本地计算机的请求”解决方法

    原因:没有开启服务器访问权限! 解决方法: 在web.config的<system.web></system.web>中加入如下配置节内容即可解决 <webService ...

  10. matlab中nargin函数的用法

    nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能. 通常可以用他来设定一些默认值,如下面的函数. 例子,函数test1的功能是输出a和b的和.如果只输入一个变量,则认为 ...