博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51NOD 1821 最优集合 [并查集]
阅读量:6116 次
发布时间:2019-06-21

本文共 1921 字,大约阅读时间需要 6 分钟。

题意:

一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i。

给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择一个S2的子集S3(|S3|<=k),使得S1∪S3的优美值最大。(集合元素可以重复)
$n,m \le 1000, Q \le 1000$

比赛时看了一眼题没认真想其实不难....现在想出来(也晚了)
考虑如何求最优值
如果现在最优值为$now$,只要找到下一个未用的$\le now+1$的最小元素$x$,最优值就可以变成$now+x$
如果找不到怎么办?去$S2$里找$\le now+1$的未用的最大元素
实现上可以用一个并查集记录某一个元素的上一个(包括自己)未用元素是谁做到$\alpha(m)$
#include 
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N=1005;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';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+1,s+1+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=1;i<=m;i++) fa[i]=i; int now=0,p1=1,p2=1; while(true){
//printf("now %d %d %d\n",now,p1,p2); if(p1<=n && a[p1]<=now+1) now+=a[p1++]; else if(k){ k--; while(p2<=m && b[p2]<=now+1) p2++; p2--; if(fa[p2]==p2) fa[p2]=find(p2-1),now+=b[p2++]; else{ int x=find(p2);//printf("x %d\n",x); if(x) fa[x]=find(x-1),now+=b[x]; else break; } }else break; } printf("%d\n",now);}int main(){ freopen("in","r",stdin); n=read(); for(int i=1;i<=n;i++){ s[i].m=read(); for(int j=1;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); }}

 

 
 
 

转载地址:http://ezvka.baihongyu.com/

你可能感兴趣的文章
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
Content Provider的权限
查看>>
416. Partition Equal Subset Sum
查看>>
centos7.0 64位系统安装 nginx
查看>>
数据库运维平台~自动化上线审核需求
查看>>
注解开发
查看>>
如何用 Robotframework 来编写优秀的测试用例
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>