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--day66--模板语言之自定义mysimpletag

  2. H3C 帧中继数据链路标识

  3. git查看当前分支所属

    1.git branch -vv 2.git config --lis

  4. 买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791

    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791

  5. Educational Codeforces Round 65 (Rated for Div. 2) E. Range Deleting(思维+coding)

    传送门 参考资料: [1]:https://blog.csdn.net/weixin_43262291/article/details/90271693 题意: 给你一个包含 n 个数的序列 a,并且 ...

  6. fatal: Not a git repository (or any of the parent directories)

    当从github.com上面下载下了Firmware后,无意中删除了Firmware目录下的.git文件夹,再去编译就会出现:   fatal: Not a git repository (or an ...

  7. win10系统激活 快捷方式

    系统不定期就会提示激活,每次激活都是找各种工具折腾,今天捣鼓简单的脚本直接激活~~ 首先查看自己系统的版本,后面才能找到合适的激活码 win+R 启动程序 输入 winver 即可查看系统版本 2.查 ...

  8. 【ts】 VSCode自动编译TypeScript终端报错

    一.点击终端--运行任务--选择tsc:监视 - tsconfig.json后,终端报出了如下错误:error TS5058: The specified path does not exist 在网 ...

  9. 随机抽样 (numpy.random)

    随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...

  10. PowerShell 通过 WMI 获取系统信息

    本文告诉大家如何通过 WMI 使用 Win32_OperatingSystem 获取设备厂商 通过下面代码可以获取 系统版本和系统是专业版还是教育版 Get-WmiObject Win32_Opera ...