CF891C Envy【最小生成树】
我们知道,根据Kruskal的贪心,对于最小生成树,每一种权值的边数是一样的,而且如果将\(\leq x\)的边做最小生成树,合法方案的联通性是一样的。所以我们可以对于所有边分开考虑。
对于一组询问,对于所有权值,权值为\(x\)的有\(k\)个,那么可以将\(<x\)的边全部加入,然后将这\(k\)个边加入,看看能不能全部加入进去。如果有一个成环了,那么肯定是不行的。
那么\(q\)组询问,可以离线下来,对于(边权,询问编号)二元组排序,然后对于同一边权的同一组询问,尝试加入,到了下一组询问就撤销,然后处理完之后又全部加入进去。用可撤销并查集就可以做了。
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = 500003;
int n, m, k, q, mx, fa[N], siz[N];
bool ans[N];
struct Edge {
int u, v, w;
inline bool operator < (const Edge &o) const {return w < o.w;}
} e[N];
struct Query {
int u, v, w, id;
inline bool operator < (const Query &o) const {return id < o.id;}
};
vector<Query> vec[N];
inline int getfa(int x){
return x == fa[x] ? x : getfa(fa[x]);
}
int stk[N], top;
inline bool comb(int x, int y){
x = getfa(x); y = getfa(y);
if(x != y){
if(siz[x] > siz[y]) swap(x, y);
siz[y] += siz[x]; fa[x] = y; stk[++ top] = x;
return true;
}
return false;
}
int main(){
scanf("%d%d", &n, &m);
for(Rint i = 1;i <= m;i ++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w), mx = max(mx, e[i].w);
scanf("%d", &q);
for(Rint i = 1;i <= q;i ++){
scanf("%d", &k);
while(k --){
int now; scanf("%d", &now);
vec[e[now].w].push_back((Query){e[now].u, e[now].v, e[now].w, i});
}
}
for(Rint i = 1;i <= mx;i ++) if(!vec[i].empty())
sort(vec[i].begin(), vec[i].end());
sort(e + 1, e + m + 1);
for(Rint i = 1;i <= n;i ++) siz[i] = 1, fa[i] = i;
for(Rint i = 1;i <= q;i ++) ans[i] = true;
for(Rint i = 1;i <= m;){
int val = e[i].w; top = 0;
for(Rint j = 0;j < vec[val].size();j ++){
if(!ans[vec[val][j].id]) continue;
if(j && vec[val][j].id != vec[val][j - 1].id){
while(top){
siz[fa[stk[top]]] -= siz[stk[top]];
fa[stk[top]] = stk[top]; -- top;
}
}
if(!comb(vec[val][j].u, vec[val][j].v)) ans[vec[val][j].id] = false;
}
while(e[i].w == val){
comb(e[i].u, e[i].v); ++ i;
}
}
for(Rint i = 1;i <= q;i ++) puts(ans[i] ? "YES" : "NO");
}
CF891C Envy【最小生成树】的更多相关文章
- CF891C Envy 最小生成树/虚树
正解:最小生成树/虚树 解题报告: 传送门! sd如我就只想到了最暴力的想法,一点儿优化都麻油想到,,,真的菜到爆炸了QAQ 然后就分别港下两个正解QAQ 法一,最小生成树 这个主要是要想到关于最小生 ...
- CF891C Envy
题面 题解 首先要知道两个性质: 对于任意权值,最小生成树上该权值的边数是相同的. 对于任意一个最小生成树,当加完所有权值小于一个任意值的边之后,当前图的连通性是一样的. 于是我们按照权值分开处理,对 ...
- CF891C Envy(离线/在线+可撤销并查集/并查集/LCT)
前置知识 最小生成树及证明 做法 每个不同权值没影响,仅需判断该次询问每种权值是否在"小于该权值的所有边加完"之后,可以全部加进来 离线:询问的所有边全堆到一起,按权值排序,然后同 ...
- CF892E Envy[最小生成树]
题意:有一张 $n$ 个点$ m $条边的连通图.有$Q$ 次询问.每次询问给出 $k[i]$ 条边,问这些边能否同时出现在一棵最小生成树上.$n,m,Q,\sum k\le 500000$. 这题利 ...
- [CF891C] Envy - Kruskal,并查集
给出一个 n 个点 m条边的无向图,每条边有边权,共 Q次询问,每次给出 \(k\)条边,问这些边能否同时在一棵最小生成树上. Solution 所有最小生成树中某权值的边的数量是一定的 加完小于某权 ...
- 题解 [CF891C] Envy
题面 解析 首先根据Kruskal算法, 我们可以知道, 在加入权值为\(w\)的边时, 权值小于\(w\)的边都已经加进树里了(除了连成环的). 所以,我们可以保存一下每条边的端点在加入生成树之前的 ...
- 【题解】CF891CEnvy
[题解] CF891C Envy 很好玩的一道题.尽管不难,但是调了很久QAQ 考虑克鲁斯卡尔最小生成树的算法,可以发现这些最小树生成的性质: 当生成树所有边的权值都\(\le\)某个$ w$的时刻, ...
- 【CF891C】Envy(最小生成树)
[CF891C]Envy(最小生成树) 题面 Codeforces 洛谷 题解 考虑\(MST\)的构建过程,对于所有权值相同的边一起考虑. 显然最终他们连出来的结果是固定的. 把连边改为把联通块联通 ...
- 【CF891C】Envy 离线+最小生成树
[CF891C]Envy 题意:给你一个图,边有边权,每次询问给你一堆边,问你是否存在一个原图的最小生成树包含给出的所有边.n,m,q<=100000 题解:思路很好的题. 首先有一个非常重要的 ...
随机推荐
- netty--处理器
编解码器的基类: 编码:MessageToByteEncode 解码:ByteToMessageDecoder
- 关于memset的赋值(最大值最小值的选择)
memset赋值赋的是ASSCII码转为二进制赋值 比如 memset(,0xff,sizeof()),0xff转为二进制11111111,int为4字节所以最后为111111111111111111 ...
- dg搭建后oracle_redo不存在
目的:在oracle 10.2.0.4 环境中,搭建oracle dg遇到 备库redo不存在的问题,另一位同事搭建oracle 11.2.0.4 dg在备库也遇到同样的问题,如下描述处理过程. 参考 ...
- Linux判断SSD或HDD + 模拟SSD
判断方法 方法一 判断cat /sys/block/*/queue/rotational的返回值(其中*为你的硬盘设备名称,例如sda等等),如果返回1则表示磁盘可旋转(HDD),返回0,则表示磁盘不 ...
- Java单例最好的设计模式:Spring 之 GlobalAdvisorAdapterRegistry
先上代码: public abstract class GlobalAdvisorAdapterRegistry { /** * Keep track of a single instance so ...
- 微信小程序自定义组件——接受外部传入的样式类
https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html 外部样式类 有时, ...
- sublime text3上设置 python 环境
1. 打开Sublime text 3 安装package control 2. 安装 SublimeREPL Preferences -> package control 或者Ctrl+shi ...
- swift 有哪些学习资源
Swift有哪些优秀的学习资源呢? 首先要推荐的当然是官方的资料了. 这个地址里放的是苹果官方为开发者提供的Swfit学习资源:https://developer.apple.com/swift/re ...
- 苹果appstore应用名下面的开发者名称填写或修改
最近上架不小心遇到一个问题,开发者名称写错了,放假前大意了,记录一下修改过程,希望碰到同样问题的伙伴不要要着急,下面的内容可能帮你哦. 我们应用的之前的开发者名称是个人的,之前没注意这个问题,以后想注 ...
- $.ajaxSetup()与$.ajax()区别
ajaxSetup()其使用方法与ajax()并无区别,只是在其之后的ajax()不用再重复添加相同参数,节省了代码量. 附:API中关于jQuery.ajaxSetup([options])的描述和 ...