题目传送门

题解:

对整个修改的区间进行分治。对于当前修改区间来说,我们对整幅图中将要修改的边权都先改成-inf,跑一遍最小生成树,然后对于一条树边并且他的权值不为-inf,那么这条边一定就是树边了。然后我们把这些点都缩成一个点。然后,我们继续对当前修改区间来说,我们把要修改的边的边权都修改成inf,跑一遍最小生成树,然后对于一条非树边来说,他的边权不为inf,那么这条边一点是非树边了,然后我们每层缩点,减边,这样图就会越来越小,然后当l == r的时候,我们还原修改操作,最后把跑最小生成树计算答案。

一道神奇的cdq题目。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 1e5 + ;
struct Node{
int u, v, c, id;
bool operator < (const Node & x) const{
return c < x.c;
}
}e[][N], f[N], g[N];
int a[N], b[N], ct[N], mapid[N];
int pre[N];
int to[N];
void link(int u, int v){
mapid[to[v]] = ;
mapid[u] = v;
to[v] = u;
}
int Find(int x){
if(x == pre[x]) return x;
return pre[x] = Find(pre[x]);
}
LL ans[N];
void Clear(int tot){
for(int i = ; i <= tot; i++){
pre[f[i].u] = f[i].u;
pre[f[i].v] = f[i].v;
}
}
void contraction(int &tot, LL &sum){
Clear(tot);
sort(f+, f++tot);
int u, v, zz = ;
for(int i = ; i <= tot; i++){
u = Find(f[i].u), v = Find(f[i].v);
if(u != v){
pre[u] = v;
if(f[i].c != -inf){
sum += f[i].c;
g[++zz] = f[i];
}
}
}
Clear(tot);
for(int i = ; i <= zz; i++){
u = Find(g[i].u); v = Find(g[i].v);
pre[u] = v;
}
zz = ;
for(int i = ; i <= tot; i++){
u = Find(f[i].u), v = Find(f[i].v);
if(u != v){
f[++zz] = f[i];
f[zz].u = u;
f[zz].v = v;
mapid[f[i].id] = zz;
}
}
tot = zz;
return ;
}
void reduction(int &tot){
Clear(tot);
sort(f+, f++tot);
int u, v, zz = ;
for(int i = ; i <= tot; i++){
u = Find(f[i].u); v = Find(f[i].v);
if(u != v){
pre[u] = v;
f[++zz] = f[i];
}
else if(f[i].c == inf)
f[++zz] = f[i];
}
tot = zz;
return ;
}
void cdq(int l, int r, int now, int tot, LL sum){
if(l == r) ct[a[l]] = b[l];
for(int i = ; i <= tot; i++){
e[now][i].c = ct[e[now][i].id];
mapid[e[now][i].id] = i;
//link(e[now][i])
f[i] = e[now][i];
}
if(l == r){
ans[l] = sum;
Clear(tot);
sort(f+, f++tot);
int u, v;
for(int i = ; i <= tot; i++){
u = Find(f[i].u), v = Find(f[i].v);
if(u != v){
pre[u] = v;
ans[l] += f[i].c;
}
}
return ;
}
for(int i = l; i <= r; i++) f[mapid[a[i]]].c = -inf;
contraction(tot, sum);
for(int i = l; i <= r; i++) f[mapid[a[i]]].c = inf;
reduction(tot);
for(int i = ; i <= tot; i++) e[now+][i] = f[i];
int mid = l+r >> ;
cdq(l, mid, now+, tot, sum);
cdq(mid+, r, now+, tot, sum); }
int main(){
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
for(int i = ; i <= m; i++){
scanf("%d%d%d", &e[][i].u, &e[][i].v, &e[][i].c);
e[][i].id = i;
ct[i] = e[][i].c;
}
for(int i = ; i <= q; i++)
scanf("%d%d", &a[i], &b[i]);
cdq(,q,,m,);
for(int i = ; i <= q; ++i)
printf("%lld\n", ans[i]);
return ;
}

bzoj 2001 CITY 城市建设 cdq分治的更多相关文章

  1. bzoj 2001: City 城市建设 cdq

    题目 PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有 ...

  2. BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Lou ...

  3. BZOJ 2001: [Hnoi2010]City 城市建设

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 555[Submit][ ...

  4. 【BZOJ2001】 [Hnoi2010]City 城市建设

    BZOJ2001 [Hnoi2010]City 城市建设 Solution 我们考虑一下这个东西怎么求解? 思考无果...... 咦? 好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除, ...

  5. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  6. BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】

    题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上 ...

  7. BZOJ2001: [Hnoi2010]City 城市建设

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至 ...

  8. 【bzoj2001】 Hnoi2010—City 城市建设

    http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...

  9. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

随机推荐

  1. istio使用教程

    kubernetes各版本离线安装包 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 yum in ...

  2. 对ThreadLocal的一些理解

    ThreadLocal也是在面试过程中经常被问到的,本文主要从以下三个方面来谈对ThreadLocal的一些理解: ThreadLocal用在什么地方 ThreadLocal一些细节 ThreadLo ...

  3. springboot-权限控制shiro(二)

    目录 1. 场景描述 2. 解决方案 1. 场景描述 (1)最近有点小忙,公司真实项目内容有点小多以及不想只介绍理论,就使用springboot单独部署了个shiro的demo项目,还是理论和实际项结 ...

  4. 49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)

    在上章 48.QT-网络通信讲解1,我们学习了网络通信基础后,本章便来实战一篇.源码正在上传中,等下贴地址. PS:支持客户端和服务器,提供源码,并且服务器支持多客户端连入,并且可以指定与个别客户端发 ...

  5. 算法与数据结构基础 - 回溯(Backtracking)

    回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...

  6. struts与springmvc有何区别

    Struts2与SpringMVC有何区别? (1)SpringMVC的核心控制器是基于servlet技术,而Struts2是基于filter. (2)Struts2是类级别的拦截, 一个类对应一个r ...

  7. 从零开始学习springboot之热部署的配置

    各位看官大家好,博主之前因为毕业设计以及毕业旅游耽搁了好长一段时间没有更新博客了,从今天起又会慢慢开始学习啦. 今天主要是来学习springboot热部署的配置. 一. 热部署 我们通常在修改某些文件 ...

  8. Cocos Creator经典游戏制作之:信使(The Messenger)

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  9. python代码规范整理

    规范参考源: 1.pep8(python代码样式规范):中文文档      https://blog.csdn.net/ratsniper/article/details/78954852 2.pep ...

  10. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...