link。

好题啊。

首先有一个类 kruskal 暴力,就是对于每一个询问,把所有边按权值大小排降序,第一个加进去成为奇环的边就是答案。注意我们不需要关注偶环长成什么样子,所以我们实际上维护的是一棵生成树。这个可以用并查集维护结点到根的边的数量来实现。

因此我们需要关注的边只有 \(O(n)\) 条了(生成树),那么维护一个区间的需要关注的边的边集,具体而言就是树边和奇环上的边。考虑用线段树,合并的时候用归并即可。

int n, m, q, fa[2100], dst[2100], ms, mh;
int u[1000100], v[1000100], w[1000100];
vi<bsi<int>> md;
bool flag;
int ldr(int x) {
if (x != fa[x]) {
int u = ldr(fa[x]);
dst[x] ^= dst[fa[x]];
return fa[x] = u;
}
return x;
}
int mrg(int x, int y) {
int u = ldr(x), v = ldr(y);
if (u == v) {
if (dst[x] == dst[y]) return 2;
return 0;
}
fa[v] = u;
dst[v] = dst[x]^dst[y]^1;
return 1;
}
bsi<int> mrg(const bsi<int>& lhs, const bsi<int>& rhs) {
bsi<int> qwq, res;
merge(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), back_inserter(qwq), [&](int x, int y) {
return w[x] > w[y];
});
for (auto i : qwq) {
fa[u[i]] = u[i], fa[v[i]] = v[i];
dst[u[i]] = dst[v[i]] = 0;
}
for (auto i : qwq) {
int tmp = mrg(u[i], v[i]);
if (tmp) res += i;
if (tmp == 2) {
flag = 1;
break;
}
}
return res;
}
void upd(int now) {
md[now] = mrg(md[now*2], md[now*2+1]);
}
int qry(int l, int r) {
bsi<int> res;
flag = 0;
for (l += ms-1, r += ms; l < r; l >>= 1, r >>= 1) {
if (l&1) res = mrg(res, md[l++]);
if (r&1) res = mrg(md[--r], res);
}
if (flag) return w[res.back()];
return -1;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> q;
mh = ceil(log2(m)), ms = 1<<mh;
md = vi<bsi<int>>(ms*2, bsi<int>());
for (int i=1; i<=m; ++i) {
cin >> u[i] >> v[i] >> w[i];
}
for (int i=1; i<=m; ++i) {
md[i+ms-1] = bsi<int>({i});
}
for (int i=ms-1; i>=1; --i) {
upd(i);
}
for (int l,r; q--;) {
cin >> l >> r;
cout << qry(l, r) << "\n";
}
}

「codeforces - 687D」Dividing Kingdom II的更多相关文章

  1. Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力并查集

    D. Dividing Kingdom II 题目连接: http://www.codeforces.com/contest/687/problem/D Description Long time a ...

  2. Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环

    D. Dividing Kingdom II   Long time ago, there was a great kingdom and it was being ruled by The Grea ...

  3. 【CF687D】Dividing Kingdom II 线段树+并查集

    [CF687D]Dividing Kingdom II 题意:给你一张n个点m条边的无向图,边有边权$w_i$.有q个询问,每次给出l r,问你:如果只保留编号在[l,r]中的边,你需要将所有点分成两 ...

  4. CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)

    Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...

  5. codeforces 687D Dividing Kingdom II 带权并查集(dsu)

    题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...

  6. CF687D Dividing Kingdom II

    \(\mathtt{CF 687D}\) \(\mathcal{Description}\) 给你一个图有 \(n\) 个点 \((1 \leq n \leq 10^3)\) 和 \(m\) 条边 \ ...

  7. 「CodeForces 581D」Three Logos

    BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...

  8. 「CodeForces - 50C 」Happy Farm 5 (几何)

    BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...

  9. 「CodeForces - 598B」Queries on a String

    BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...

  10. 「CodeForces - 717E」Paint it really, really dark gray (dfs)

    BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...

随机推荐

  1. Vue——前端发展史、Vue介绍和使用、插值语法、文本指令、事件指令

    前端的发展史 # 1 HTML(5).CSS(3).JavaScript(ES5.ES6):编写一个个的页面 -> 给后端(PHP.Python.Go.Java) -> 后端嵌入模板语法 ...

  2. 【前端方案】-表格排序列LRU缓存方案

    目标: 排序后的表格列,页面刷新或者用户重新登录后,能够保持之前的操作排序 完成效果: 解决方案: 利用localstorage对排序后的表格列属性进行存储,页面刷新或者用户重新进入该页面时都先从lo ...

  3. AI-2预备知识

    2.1数据操作笔记 PyTorch和TensorFlow中的Tensor类型可做为张量使用,可支持GPU操作和自动微分. 广播机制:对不同形状的张量可使用广播机制进行运算. 为节省内存,可使用 X[: ...

  4. JS逆向实战19——通杀webpack逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 网站 aHR0cHM6Ly ...

  5. 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode 通常是指一个原始的可执行 ...

  6. Java杂记————object.getClass()和object.class以及Java中的toString()方法的的区别

    不说废话,直接上干货: (注意大小写:object为对象,Object为类) 1,object.getClass()它是Object类的实例方法,返回一个对象运行时的类的Class对象,换句话说,它返 ...

  7. kafka入门必备知识

    1. Kafka是一个分布式流处理平台: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的记录,并且有较好的容错性. 可以在流式记录产生时就进行处理. 2. 消息 ...

  8. 补充 6-13 《关于SQL SERVER 字段类型char(n) , nchar(n) , varchar(n) , nvarchar(n)》

    今天补充一下<关于SQL SERVER 字段类型char(n) , nchar(n) , varchar(n) , nvarchar(n)>类型的区别 虽然两个字符串一样,但是定义的类型不 ...

  9. python3使用PIL添加中文文本水印背景

    环境:Windows10_x64  Python版本 :3.9.2 Pillow版本:9.1.1   写的博客文章被转载且不注明出处的情况时有发生,甚至有部分转载者将文章配图添加自己的水印!为了保护作 ...

  10. TiDB简述及TiKV的数据结构与存储

    1 概述 TiDB 是 PingCAP 公司自主设计.研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical ...