[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. 百度翻译api 实现简易微信翻译小程序

    介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示   使用百度翻译api需要申请 appid 与 key 并在 ap ...

  2. mysql 按日期统计

    按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...

  3. metamask注记词

    leaf orbit poet zebra toy day put dinosaur review cool pluck throw(m) 一个钱包地址 里面有多个账号 菲苾代表了不同网络

  4. .net转PHP从零开始-环境的搭建

    PHP初级开发环境安装很简单,只需要使用一键安装的phpstudy 下载地址:http://www.phpstudy.net/ 安装后可以看到 这样的界面,设置好相关的配置,然后,选择查看phpinf ...

  5. Python-列表练习

    1.使用列表生成式生成如下列表:[1,9,25,49,81] s = [i**2 for i in range(1,10)if i%2==1] print(s) 2.输入一个由英文单词组成的字符串(分 ...

  6. 本周PSP图

    本周共写博文5篇,共计4800字,知识点:知道了博客应当如何写,接触了博客园,阅读了构建之法 内容 开始时间 结束时间 中断时间 共计时间 9月8日博文 22:00 22:55 10min聊天 45m ...

  7. Notes of the scrum meeting before publishing(12.19)

    meeting time:18:30~20:30p.m.,December 19th,2013 meeting place:3号公寓一层 attendees: 顾育豪                  ...

  8. LintCode-35.翻转链表

    翻转链表 翻转一个链表 样例 给出一个链表 1->2->3->null ,这个翻转后的链表为 3->2->1->null 挑战 在原地一次翻转完成 标签 链表 优步 ...

  9. iOS- 非ARC的项目内存管理细节详解(实战)

    1.前言 接上文:iOS- 如何将非ARC的项目转换成ARC项目(实战) 2.内存管理时相关的配置 当我们把将非ARC的内存管理都管理好后,发现在做有些操作的时候内存还是在一直的缓慢增加 比如做一个最 ...

  10. VBA 实现学校上课教员一学期中所有上课时间,在一页中通过背景底色反应出来

    需求:学校一学期的所有课程表,每个教员都有可能上好几门课,但给一个教员调课时需要查找所调课时间位置有没有此教员上其它的课 相冲突,手动查找很不方便,这里想通过一个表中位置显示出同一教员在所有课表中出现 ...