51NOD 1821 最优集合 [并查集]
题意:
一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i。
比赛时看了一眼题没认真想其实不难....现在想出来(也晚了)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a,b,k;
struct Set{
int s[N],m;
int& operator [](int x){return s[x];}
void Sort(){sort(s+,s++m);}
}s[N];
int fa[N];
inline int find(int x){return x==fa[x] ? x : fa[x]=find(fa[x]);}
void solve(Set &a,Set &b,int k){
//printf("%d ",a.m);for(int i=1;i<=a.m;i++) printf("%d ",a[i]);puts("");
//printf("%d ",b.m);for(int i=1;i<=b.m;i++) printf("%d ",b[i]);puts("");
int n=a.m , m=b.m;
for(int i=;i<=m;i++) fa[i]=i;
int now=,p1=,p2=;
while(true){//printf("now %d %d %d\n",now,p1,p2);
if(p1<=n && a[p1]<=now+) now+=a[p1++];
else if(k){ k--;
while(p2<=m && b[p2]<=now+) p2++;
p2--;
if(fa[p2]==p2) fa[p2]=find(p2-),now+=b[p2++];
else{
int x=find(p2);//printf("x %d\n",x);
if(x) fa[x]=find(x-),now+=b[x];
else break;
}
}else break;
}
printf("%d\n",now);
}
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++){
s[i].m=read();
for(int j=;j<=s[i].m;j++) s[i][j]=read();
s[i].Sort();
}
int Q=read();
while(Q--){
a=read();b=read();k=read();
solve(s[a],s[b],k);
}
}
51NOD 1821 最优集合 [并查集]的更多相关文章
- 51NOD 1821 最优集合 栈
1821 最优集合 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...
- 51nod 1821 最优集合(思维+单调队列)
题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求 ...
- 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)
最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...
- BZOJ 1821 部落划分(二分+并查集)
答案是具有单调性的. 因为最近的两个部落的距离为mid,所以要是有两个野人的距离<mid,则他们一定是一个部落的. 用并查集维护各联通块,如果最后的联通块个数>=k,那么mid还可以再小点 ...
- BZOJ 1821 Group 部落划分 并查集
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1821 题目大意: 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所 ...
- POJ1703(2集合并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39402 Accepted: ...
- 并查集 (Union-Find Sets)及其应用
定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的 ...
- 并查集(HDOJ 1856)
并查集 英文:Disjoint Set,即“不相交集合” 将编号分别为1…N的N个对象划分为不相交集合, 在每个集合中,选择其中某个元素代表所在集合. 常见两种操作: n 合并两个集合 ...
- poj 1611 The Suspects(第一道并查集)
题意: 有N个学生,编号为0-n-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染, 并且这些人如果还参加了别的社团,他所在的社团照样全部感染,社团个数为m,求感染的人数. 输入: n代表人 ...
随机推荐
- vuejs中执行npm run dev出现页面cannot GET/问题
1.问题描述 最近用vue-cli搭建了一个小项目,其中在对项目进行打包测试时修改了webpack.base.conf.js中的配置信息,之后再用npm run dev之后出现如下的情况: 最近又有网 ...
- UE4/Unity3D中同时捕获多高清摄像头的高效插件
本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...
- js 获取url链接的任意参数
<script> //先获取 当前的url链接 var url = location.href; //把url 链接切割为数组 var arr = url.split("&quo ...
- 2017-07-03(VIM ACL权限 )
VIM 底行模式 :w 保存 :q 退出 :! 强制执行 :ls 列出打开的所有文件 :n 进行下一个查询 :15 定位到15行 /xxx 从光标处向下查找xxx出现的位置 ?xxx 从光标处向上查找 ...
- junit忽略测试方法
JUnit 提供注解 org.junit.Ignore 用于暂时忽略某个测试方法或者说整个类.因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行. 1,方法级别上使用@ignore来注释 ...
- STL map简单使用
#include <map> #include <iostream> //pair使用头文件iostream using namespace std; int main() { ...
- 字体类形:font-family, font-style
语法:{font-family:字体1,字体2,字体3,...} 作用:调用客户端字体 font-family: "Lantinghei SC","Microsoft Y ...
- JDBC (五)
1 使用dbutils进行一对多.多对多的开发 1.1 准备 mysql驱动的pom.xml <!-- https://mvnrepository.com/artifact/mysql/mysq ...
- DAY10-万物皆对象-2018-2-2
许久没有写了,虽然每天都有在学,但是学的东西也少了,后面难度慢慢加大,学习速度也是变慢了.这是许多天积累下来的笔记,从第一次接触对象,到慢慢去了解,现在处于还待深入了解的状态.万物皆对象,那是不是说没 ...
- 【SqlServer系列】浅谈SQL Server事务与锁(上篇)
一 概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...