tyvj 1666 城市建设【最小生成树】】的更多相关文章

-Wall是个好东西,要不然我至死都看不出来我把(b[i]+b[j])写成了(b[i],b[j])-- 还是来自lyd的题解: (其实原来课件第一行式子写错了没有-1,然而我用sai手画了一个上去hhhh,板绘选手表示鼠绘真难) #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=100005; long long n,a[N],b[N],h[N…
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 555[Submit][Status][Discuss] Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需…
[HNOI2010]城市建设 玄学cdq O(nlog^2n)的动态最小生成树 其实就是按照时间cdq分治+剪枝(剪掉一定出现和不可能出现的边) 处理[l,r]之间的修改以及修改之后的询问,不能确定是否加入的边集为E 对于会被改变边权的边,边集为Q,暂时不能确定 不妨大力假设: 都是-inf,这个时候把Q的边都加入之后,剩下的E进行kruskal如果还能加入,那么在[l,r]这个区间里的所有询问,一定都能加进去 并查集带着必须边,然后处理Q都是inf,剩下的E进行kruskal,如果还是不能加入…
目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点.另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接. 栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建…
[LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\)分治 对时间进行分治 因为每次分治都必须要缩小数据规模 而我们这里貌似无法满足这个要求 引进了下面的玄学东西: 设当前边集的大小为\(n\),分治区间为\([l,r]\) 则对于分治区间内的边,我们有如下两种剪枝: \((1)Contraction:\) 将现在所有分治区间内的边权设为\(-\inf…
Description \(n\) 个点 \(m\) 条边的带边权无向图.\(q\) 次操作,每次修改一条边的权值. 求每次修改后的最小生成树的边权和. Hint \(1\le n\le 2\times 10^4, 1\le m, q\le 5\times 10^4, 1\le \text{边权}\le 5\times 10^7\) Solution 考虑对时间进行分治,\(\textbf{solve}(l, r)\) 表示处理第 \(l\) 到第 \(r\) 个操作,并对原图生效这些修改的过程…
问题描述: PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和,Louis决定求助于你来完成这个任务. 输入格式: 第一行包含三个整数N,M,Q,分别表示城市的数目,可以修建的道…
随着智慧城市建设步伐的大力推进,各地的智慧城市建设取得了卓有成效的成果.物联网工程正在如火如荼地进行,顺应智慧城市物联网的发展大趋势,建设城市级的视频感知网,涉及治安.交通.教育等多方面综合传感应用,助力智慧城市建设.因此融入物联网功能的摄像机应运而生,为摄像机插上感知的翅膀,使摄像机耳聪目明.感知摄像机具备RFID功能及车辆抓拍识别功能,同时支持2.4G RFID探测,全向天线,探测距离可达100米. 智能感知摄像机功能应用 1.电动车管理 电动车偷盗严重,现有的机械车锁已经基本失去防盗功能,…
[BZOJ2001][HNOI2010]城市建设(CDQ分治,线段树分治) 题面 BZOJ 洛谷 题解 好神仙啊这题.原来想做一直不会做(然而YCB神仙早就切了),今天来怒写一发. 很明显这个玩意换种做法可以用线段树分治做,那么只需要\(LCT\)动态维护一下\(LCT\)就好了,时间复杂度?似乎是\(O(nlog^2m)\)的,每条边放在线段树上是一个\(log\)的,\(LCT\)还要一个\(log\),然而常数十分大,大得一匹,洛谷上只能过\(80\)分. #include<iostrea…
BZOJ2001 [Hnoi2010]City 城市建设 Solution 我们考虑一下这个东西怎么求解? 思考无果...... 咦? 好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除,然后不确定的保留,必须选的就去确定连通性. 然后可以了? 好妙啊.cdq果然还是万金油. 代码实现 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include…
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立…
这个题...暴力单次修改\(O(n)\),爆炸... $ $ 不过好在可以离线做 如果可以在 分治询问 的时候把图缩小的话就可以做了 硬着头皮把这个骚东西看完了 $ $ 动态最小生成树 然后,就把它当板子写好了... 思路是这样的: 经过修改后会得到 \(K\) 个 \(MST\),在这些 \(MST\) 中,有些边是反复在用的,有些边是一直没有用到的 那么考虑把这些边去除掉,就能把图给缩小 关键就是这么两个东西: \(contraction\) 处理必需边,将询问中的边权值设为 \(-inf\…
问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点.另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接. 栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费. 市长希望栋栋给出一个方案,…
题面不好找放一个吧. Description 描述 在有$N$个地级市的H省,政府为了城市开发建设,决定先修路,后造房子,以吸引外来人员.一开始每个城市中有$b_i$个住户,而在两个城市$u,v$之间建路需要的代价就是$R$乘以$u,v$两个城市的住户数目之和.建路的目标是使得所有城市相互之间都可达. 建完路之后,就要造房子了,由于$H$省的房产商仅有一家,所以只能一户一户的造房子.不过政府有权利任意安排建造的顺序,在城市i建造一个房子的代价是,$h_i$乘以城市i当前住户数目同城市i周边城市(…
问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点.另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接. 栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费. 市长希望栋栋给出一个方案,…
DescriptionPS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你来完成这个任务.Input文件第一行包含三个整数N,M,Q,分别表示城市的数目,…
Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你来完成这个任务. Input 文件第一行包含三个整数N,M,Q,分别表示城市的…
题目 PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有的城市连通.但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你来完成这个任务. 题解 经典的动态最小生成树问题. 可以采用cdq分治的方式来解决. 核心思想就…
题目大意:动态最小生成树,可以离线,每次修改后回答,点数20000,边和修改都是50000. 顾昱洲是真的神:顾昱洲_浅谈一类分治算法 链接: https://pan.baidu.com/s/1c2lkayO 密码: 83rx 讲的很妙,大致的几个注意点在代码里面也有提到. #include <iostream> #include <cstdio> #include <cstdlib> #include <queue> #include <algori…
http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之后的图的最小生成树边权和. Solution nnd开了半个小时的脑洞,然并卵.感谢这位大爷的代码与题解:http://blog.csdn.net/u013368721/article/details/39183033 我们对时间cdq分治,如何在每一层向下递归的时候减小问题规模呢,两个关键的操作:…
BZOJ 2001 很神仙的cdq分治 先放论文的链接   顾昱洲_浅谈一类分治算法 我们考虑分治询问,用$solve(l, r)$表示询问编号在$[l, r]$时的情况,那么当$l == r$的时候,直接把询问代入跑一个最小生成树就好了. 然而问题是怎么缩小每一层分治的规模,因为每一层都用$n$个点$m$条边来算稳$T$. 那么我们可以进行两个过程: 1.Reduction 把与当前询问有关的边权设为$inf$跑最小生成树,那么此时不被连到最小生成树中的边一定是没什么用的,直接扔掉,这一步可以…
题目传送门 题解: 对整个修改的区间进行分治.对于当前修改区间来说,我们对整幅图中将要修改的边权都先改成-inf,跑一遍最小生成树,然后对于一条树边并且他的权值不为-inf,那么这条边一定就是树边了.然后我们把这些点都缩成一个点.然后,我们继续对当前修改区间来说,我们把要修改的边的边权都修改成inf,跑一遍最小生成树,然后对于一条非树边来说,他的边权不为inf,那么这条边一点是非树边了,然后我们每层缩点,减边,这样图就会越来越小,然后当l == r的时候,我们还原修改操作,最后把跑最小生成树计算…
神仙题 题目大意: 有一张\(n\)个点\(m\)条边的无向联通图,每次修改一条边的边权,问每次修改之后这张图的最小生成树权值和 话说是不是\(cdq\)题目都可以用什么数据结构莽过去啊-- 这道题目确实是\(cdq\)好题 \(cdq\)分治一定要处理多维偏序问题吗?并不是,它的核心思想是一个用子问题计算对另一个子问题的贡献 我们将这道题按照时间轴来分治,那么显然一个子问题对另一个子问题是存在贡献的 我们将整张图上的边进行分类: 在当前分治区间内涉及到修改的边称为动态边 其他边称为静态边 我们…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至多只有r-l+1个,边数只有2*(r-l+1)-1个(生成树+修改边). 时间复杂度O(nlog^2(n)) #include<cstring> #include<iostream> #include<cstdio> #include<algorithm> #d…
题意是求将所有点联通所花费的最小金额,如不能完全联通,输出 -1 直接Kruskal,本题带来的一点教训是 rank 是algorithm头文件里的,直接做变量名会导致编译错误.没查到 rank 的具体用途...... #include <cstdio> #include <iostream> #include <algorithm> /*rank 是algorithm里的*/ using namespace std; ],r[]; int n,m,k,ans; str…
一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> #include<…
问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面的MST上 2.然后求出一定无用的边 对于未处理的边,全部设为INF,求一次MST,不在MST上的边一定不会出现在后面的MST上 这两点非常好证明 然后来观察一下时间复杂度 对于1,求出了一定有用的边,那至少有n-[区间长度]条(因为至少有n-1条边) 我们把它们缩点,这样之后,点数就保证和区间长度…
题目链接 线段树分治+LCT只有80 然后就有了CDQ分治的做法 把不可能在生成树里的扔到后面 把一定在生成树里的扔到并查集里存起来 分治到l=r,修改边权,跑个kruskal就行了 由于要支持撤销,并查集要按秩合并 #include"cstdio" #include"cstring" #include"iostream" #include"algorithm" using namespace std; const int M…
题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上就只有一条边不同,我们实际浪费了很多时间在处理相同的边上 那就考虑分治 对于一个待修改的边集,我们将其权值全部设为\(-\infty\),跑一遍\(BST\),此时其它边如果被选中,说明这些边在单独询问时也一定会被选,将这些边连的点缩点 同样,对于一个待修改的边集,我们将其权值全部设为\(\inft…
Problem 这题呢 就边权会在某一时刻变掉-众所周知LCT不支持删边的qwq- 所以考虑线段树分治- 直接码一发 如果 R+1 这个时间修改 那就当做 [L,R] 插入了一条边- 然后删的边和加的边存起来到栈 好删除贡献 注意一下最后一段加边-- 这题没了 #include <bits/stdc++.h> #define rep(i , x , y) for(register int i = (x) , _## i = ((y) + 1) ; i < _## i ; i ++) #d…