bzoj5216: [Lydsy2017省队十连测]公路建设
题目思路挺巧妙的。
感觉应该可以数据结构一波,发现n很小可以搞搞事啊。然后又发现给了512mb,顿时萌生大力线段树记录的念头
一开始想的是记录节点的fa,然后发现搞不动啊??
但其实边肯定最多只有n-1条,那么就可以记录选择的边,然后用归并合并即可
没清空答案还wa可一次(lll¬ω¬),浪费时间写暴力和拍(lll¬ω¬)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int m;
struct edge
{
int x,y,d;
}e[]; struct node
{
int l,r,lc,rc,as[];
}tr[];int trlen; int n,fa[];
int findfa(int x)
{
if(fa[x]==x)return x;
fa[x]=findfa(fa[x]);return fa[x];
}
void mergesort(int now,int lc,int rc)
{
for(int i=;i<=n;i++)fa[i]=i; int Llim=min(n-,tr[lc].r-tr[lc].l+);
int Rlim=min(n-,tr[rc].r-tr[rc].l+); int p=,i=,j=; int fx,fy;
while(i<=Llim&&j<=Rlim&&p<=n-)
{
int Lid=tr[lc].as[i],Rid=tr[rc].as[j];
if(e[Lid].d<e[Rid].d)
{
fx=findfa(e[Lid].x);fy=findfa(e[Lid].y);
if(fx!=fy)
{
fa[fx]=fy;
tr[now].as[p++]=Lid;
}
i++;
}
else
{
fx=findfa(e[Rid].x);fy=findfa(e[Rid].y);
if(fx!=fy)
{
fa[fx]=fy;
tr[now].as[p++]=Rid;
}
j++;
}
}
while(i<=Llim&&p<=n-)
{
int id=tr[lc].as[i];
fx=findfa(e[id].x),fy=findfa(e[id].y);
if(fx!=fy)
{
fa[fx]=fy;
tr[now].as[p++]=id;
}
i++;
}
while(j<=Rlim&&p<=n-)
{
int id=tr[rc].as[j];
fx=findfa(e[id].x),fy=findfa(e[id].y);
if(fx!=fy)
{
fa[fx]=fy;
tr[now].as[p++]=id;
}
j++;
}
} //-----------merge----------------------------- void bt(int l,int r)
{
int now=++trlen;
tr[now].l=l;tr[now].r=r;
tr[now].lc=tr[now].rc=-;
if(l==r)tr[now].as[]=l;
else
{
int mid=(l+r)/;
tr[now].lc=trlen+;bt(l,mid);
tr[now].rc=trlen+;bt(mid+,r);
mergesort(now,tr[now].lc,tr[now].rc);
}
}
void query(int now,int l,int r)
{
if(tr[now].l==l&&tr[now].r==r)
{
tr[trlen+]=tr[trlen+];
mergesort(trlen+,trlen+,now);
tr[trlen+].r=tr[now].r;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/; if(r<=mid) query(lc,l,r);
else if(mid+<=l)query(rc,l,r);
else query(lc,l,mid), query(rc,mid+,r);
}
int main()
{
freopen("data.in","r",stdin);
freopen("1.out","w",stdout); int Q;
scanf("%d%d%d",&n,&m,&Q);
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].d);
trlen=;bt(,m); int l,r;
while(Q--)
{
scanf("%d%d",&l,&r);
tr[trlen+].l=l;tr[trlen+].r=l-;
memset(tr[trlen+].as,,sizeof(tr[trlen+].as));
query(,l,r); long long ans=;
for(int i=;i<=min(n-,r-l+);i++)
ans+=((long long)(e[tr[trlen+].as[i]].d));
printf("%lld\n",ans);
}
return ;
}
bzoj5216: [Lydsy2017省队十连测]公路建设的更多相关文章
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 93 Solved: 53[Submit][Status][ ...
- bzoj 5216: [Lydsy2017省队十连测]公路建设
5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 66 Solved: 37[Submit][St ...
- Lydsy2017省队十连测
5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...
- 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)
传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...
- bzoj 5218: [Lydsy2017省队十连测]友好城市
题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用 ...
- 【BZOJ 5222】[Lydsy2017省队十连测]怪题
题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...
- 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)
传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...
- BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT
被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...
- BZOJ5217:[Lydsy2017省队十连测]航海舰队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5217 Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格 ...
随机推荐
- Rsync同步神器
Rsync清理大批量垃圾数据 在Linux下删除海量文件的情况,需要删除数十万个文件.这个是之前的程序写的日志,增长很快,而且没什么用.这个时候,我们常用的删除命令rm -fr * 就不好用了,因为要 ...
- Java电子书下载地址
http://www.itpub.net/search.php?searchid=1660&orderby=lastpost&ascdesc=desc&searchsubmit ...
- 文件操作:Directory,File,FielStream、StreamRead和StreamWriter的使用
Directory文件类,File,FielStream.StreamRead和StreamWriter的使用 (转载) 创建一个新文件 Directory.CreateDirectory(@&quo ...
- Intel VTune Amplifier XE 使用
VTune <VTune 开发者手册> 1. 安装 1.1 软件安装 下载: (安装包下载地址) 安装: # 1.解压 tar -zxvf filename.tar.gz # 2.安装 c ...
- Redis之Ubuntu下Redis集群搭建
安装redis 首先下载redis $ wget http://download.redis.io/releases/redis-4.0.10.tar.gz $ .tar.gz $ cd redis- ...
- YARN环境搭建 之 二:CentOS7.0 JDK配置
Hadoop是Java写的,他无法使用Linux预安装的OpenJDK,因此安装hadoop前需要先安装JDK(1.6以上) 原材料:在Oracle官网下载的32位JDK: 说明: 1.C ...
- Wireshark抓本地回环
最近正好要分析下本机两个端口之间通信状况.于是用wireshark抓包分析.对于本地回环要进行一些特殊的设置. 1.通过“运行”---“cmd” 输入“route add [本机IP]mask 255 ...
- STL编程:C++的忠告!
Copy别人的,有少量修改,可以做为一下参考! C++之父Bjarne Stroustrup 写的 The C++ Programming Language (Special Edition) 中各章 ...
- 企业级任务调度框架Quartz(5) Quartz的声明式配置
前序: 前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示:但具体到实际的时候,如果我们要在 Job 启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的 ...
- 【转】Oracle基础结构认知—初识oracle 礼记八目 2017-12-12 21:19:30
Oracle服务器(oracle server)由实例和数据库组成.其中,实例就是所谓的关系型数据库管理系统(Relational Database Management System,RDBMS), ...