2、公路建设(highway.c/cpp/pas)

在滨海市一共有n 个城市,编号依次为1到n,它们之间计划修建m条双向道路,其中修建第i条道路的费用为ci。

海霸王作为滨海市公路建设项目的总工程师,他决定选定一个区间[l,r],仅使用编号在该区间内的道路。他希望选择一些道路去修建,使得连通块的个数尽量少,同时,他不喜欢修建多余的道路,因此每个连通块都可以看成一棵树的结构。为了选出最佳的区间,海霸王会不断选择q个区间,请写一个程序,帮助海霸王计算每个区间内修建公路的最小总费用。

Input

第一行包含三个正整数n,m,q,表示城市数、道路数和询问数。接下来m行,每行三个正整数ui,vi,ci,表示一条连接城市ui和vi的双向道路,费用为ci。接下来q行,每行两个正整数li,ri,表示一个询问。

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

Notes

60% 从ci=i。

100% 的数据,1 ≤ui,vi≤n<=100,ui≠vi,1≤li≤ri≤m,1≤ci≤106。

【题解】

考虑部分分,边的权值单调递增。

直接倒着扫所有边,加入该边时如果还未连通就直接加,否则找到环上最大的边删去换成这条,将查询按左端点从大到小排序,扫到左端点相同时查询现在树上所有边是否在区间内,是就将答案加它。

正解

发现n很小,可以使用线段树,叶子结点表示每条路,区间查询[l,r]即可。

每个节点维护一个vector表示这个区间内生成的最小生成森林选了那些边。

合并时使用归并排序,将2个区间的边排序后跑克鲁斯卡尔即可。

复杂度m*n+q*logm*n。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+;
int n,m,q,fa[],b[M];
struct bian
{
int u,v,c,id;
}a[M];
vector <int> ve[M<<],ddhu,ans;
inline int find(int x)
{
if(x==fa[x]) return x;
fa[x]=find(fa[x]);
return fa[x];
}
inline int read()
{
char c=getchar();
int x=,f=;
while(!isdigit(c)) {if(c=='-') f=-;c=getchar();}
while(isdigit(c)) {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*f;
}
inline void pushup(int x,int y)
{
ddhu.clear();
int cnt=,zi=,yi=,zlen=ve[x].size(),ylen=ve[y].size();
while(zi<zlen&&yi<ylen)
{
if(a[ve[x][zi]].c<a[ve[y][yi]].c) b[++cnt]=ve[x][zi++];
else b[++cnt]=ve[y][yi++];
}
while(zi<zlen) b[++cnt]=ve[x][zi++];
while(yi<ylen) b[++cnt]=ve[y][yi++];
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=cnt;i++)
{
int fa1=find(a[b[i]].u);
int fa2=find(a[b[i]].v);
if(fa1!=fa2)
{
fa[fa1]=fa2;
ddhu.push_back(b[i]);
}
}
} inline void build(int now,int l,int r)
{
if(l==r)
{
ve[now].push_back(l);
return;
}
int mid=(l+r)>>;
build(now<<,l,mid);
build(now<<|,mid+,r);
pushup(now<<,now<<|);
ve[now].clear();
int gu=ddhu.size();
for(int i=;i<gu;i++) ve[now].push_back(ddhu[i]);
}
inline void query(int now,int l,int r,int L,int R)
{
if(l>=L&&r<=R)
{
int huan=ans.size();
ve[(M<<)-].clear();
for(int i=;i<huan;i++) ve[(M<<)-].push_back(ans[i]);
pushup((M<<)-,now);huan=ddhu.size();ans.clear();
for(int i=;i<huan;i++) ans.push_back(ddhu[i]);
return;
}
int mid=(l+r)>>;
if(L<=mid) query(now<<,l,mid,L,R);
if(R>=mid+) query(now<<|,mid+,r,L,R);
}
int main()
{
// freopen("highway.in","r",stdin);
// freopen("highway.out","w",stdout);
n=read();m=read();q=read();
for(int i=;i<=m;i++)
a[i].u=read(),a[i].v=read(),a[i].c=read();
build(,,m);
for(int i=,x,y;i<=q;i++)
{
x=read();y=read();
ans.clear();
query(,,m,x,y);
int daan=,huan=ans.size();
for(int j=;j<huan;j++) daan+=a[ans[j]].c;
cout<<daan<<"\n";
}
fclose(stdin);
fclose(stdout);
} //3 5 2
//1 3 2
//2 3 1
//2 1 6
//3 1 7
//2 3 7
//2 5
//3 4

floj 2264的更多相关文章

  1. [COGS 2264]魔法传输

    [COGS 2264]魔法传输 题目 自从看了<哈利波特>,小Y就十分渴望获得魔法值.于是他和一群向往魔法的孩子(当然这些孩子们都是不会魔法的)来到了哈利波特的家,大家坐成一排.哈利波特会 ...

  2. LCS(打印全路径) POJ 2264 Advanced Fruits

    题目传送门 题意:两个字符串结合起来,公共的字符只输出一次 分析:LCS,记录每个字符的路径 代码: /* LCS(记录路径)模板题: 用递归打印路径:) */ #include <cstdio ...

  3. 【LOJ】#2264. 「CTSC2017」吉夫特

    题解 根据一番认真严肃的猜结论和打表证明之后 我们可以得到 \(f[i] = (\sum_{a[i] \& a[j] == a[j]} f[j]) + 1\) 统计所有的\(f[i] - 1\ ...

  4. poj 2264(LCS)

    Advanced Fruits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2158   Accepted: 1066   ...

  5. poj 2264 Advanced Fruits(DP)

    Advanced Fruits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1944   Accepted: 967   ...

  6. floj 2265 【lxs Contest #141】航海舰队

    首先抠出包围了阵形的最小矩形. 将地图拉伸成一条链,即将第一行.第二行.第三行按顺序连接.阵形也可以用同样的方法处理. 那么问题转化为,给定两个 01 串 S 和 T,问每个 S 中长度为 |T| 的 ...

  7. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  8. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  9. poj上的dp专题

    更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...

随机推荐

  1. Python--day64--author表多对多关联book表

    数据库数据结构设计:

  2. poj1573

    题意:给出一个矩形,N,E,S,W分别代表进行移动的方向,如果走出矩形网格则输出经过的网格数,如果在矩形网格内循环,则输出没进入循环之前所走过的网格数和循环所经过的网格数: 思路:创建两个数组,一个字 ...

  3. 2018-12-25-SourceYard-制作源代码包

    title author date CreateTime categories SourceYard 制作源代码包 lindexi 2018-12-25 9:43:7 +0800 2018-12-09 ...

  4. Codeforces Round #184 (Div. 2)

    A. Strange Addition (目前的做法好像做烦了) 统计数的\(mask\),表示个.十.百位上是否是0,共8种数. 枚举8种数组成的所有情况\(2^8\),记录最大数量. B. Con ...

  5. java 使用反射调用可变参数方法

    使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参 ...

  6. PHP mysql扩展整理,操作数据库的实现过程分析

    相关文章:PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理   PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 从某种程度上 ...

  7. linux 延后执行

    设备驱动常常需要延后一段时间执行一个特定片段的代码, 常常允许硬件完成某个任务. 在这一节我们涉及许多不同的技术来获得延后. 每种情况的环境决定了使用哪种技术最好; 我们全都仔细检查它们, 并且指出每 ...

  8. js中的函数重载

    函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...

  9. H3C查看保存的配置文件

  10. geoip ip2region2 with spark

    上一篇文章中 我使用 maxmind的免费库开发了一个waterdrop的 插件,测试数据发现,国内的有些市级还是不准确,而且香港并不是显示中国,这就不友好了. 找了一下,发下 ip2region 这 ...