【Henu ACM Round#20 D】 Devu and Partitioning of the Array-程序员宅基地

技术标签: 数据结构与算法  

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


一开始所有的数字单独成一个集合。
然后用v[0]和v[1]记录集合的和偶数奇数的集合它们的根节点(并查集

然后先让v[0]的大小变成p

//奇数+偶数是奇数
//奇数+奇数是偶数
//偶数+偶数是偶数

如果v[0].size < p
那么随便让两个和为奇数的集合,让他们合并在一起,加入到偶数集合中,那么v[0].size++,v[1].size-=2了

如果v[0].size > p
那么有两种方法
 1.让两个偶数集合合并在一起,变成一个更大的偶数集合,v[0].size()--
 2.让一个偶数集合和一个奇数集合合并在一起,变成一个奇数集合,v[0].size()--,但是奇数集合个数还是不变

此后v[0].size==p了

那么接下来只要调整v[1].size就好了
但是在调整之前先判断v[0].size()+v[1].size()>=k是否成立

如果小于k的话,是肯定没办法变多的。
因为越并只能越少的

然后如果大于k的话,只能把v[1]的大小变小了。
根据上面奇数和偶数相加的规则。
不难发现。
只能把两个奇数合并成偶数才能减少奇数的个数。
且显然奇数只能两个两个地减少。
减少的过程如下
1.把两个奇数合并成1个偶数。
2.把新合成的那个偶数去掉
 有两种去掉的方法
   ①用两个偶数集合合成一个新的偶数集合
   ②再用一个奇数和这个偶数,合成一个奇数集合

最后看看v[0].size()+v[1].size()是否等于k就好。
最后根据并查集的根节点。
输出每个集合里面的元素就好。

【代码】

#include <bits/stdc++.h>
using namespace std;



//������������ж��ٸ���ż���ж��ٸ�
//����+ż��������
//����+������ż��
//ż��+ż����ż��
//������û��p��ż��
//���û�еĻ�
// ����������һ��ż��

const int N = 1e5;

int n,k,p;
int f[N+10],a[N+10];
vector<int> v[2];
vector<int> bo[N+10];

int ff(int x){
    if (f[x]==x)
        return x;
    else
        return f[x] = ff(f[x]);
}

int qu(int idx){
    int x = v[idx].back();
    v[idx].pop_back();
    return x;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> k >> p;

    for (int i = 1;i <= n;i++){
        cin >> a[i];
        v[a[i]%2].push_back(i);
    }
    for (int i = 1;i <= n;i++) f[i] = i;


    while ((int)v[0].size()<p){
        if ((int)v[1].size()>=2){
            int x = qu(1),y = qu(1);
            int r1 = ff(x),r2 = ff(y);
            f[r1] = r2;
            v[0].push_back(r2);
        }else{
            return cout<<"NO"<<endl,0;
        }
    }
    //a[0] >= p
    while ((int)v[0].size()>p){
        if ((int)v[0].size()>1){
            int x = qu(0),y = qu(0);
            int r1 = ff(x),r2 = ff(y);
            f[r1] = r2;
            v[0].push_back(r2);
            continue;
        }
        if ((int)v[1].size()>0){
            int x = qu(1);
            int y = qu(0);
            int r1 = ff(x),r2 = ff(y);
            f[r1]=r2;
            v[1].push_back(r2);
        }else return cout<<"NO"<<endl,0;
    }

    //a[0]==p
    if ((int)v[0].size()+(int)v[1].size()<k){
        return cout<<"NO"<<endl,0;
    }

//����+ż��������
//����+������ż��
//ż��+ż����ż��
    while ((int)v[0].size()+(int)v[1].size()>k){
        if ((int)v[1].size()>=2){
            int x = qu(1),y = qu(1);
            int r1 = ff(x),r2 = ff(y);
            f[r1] = r2;
            v[0].push_back(r2);
        }else{
            return cout<<"NO"<<endl,0;
        }
        if ((int)v[0].size()>1){
            int x = qu(0),y = qu(0);
            int r1 = ff(x),r2 = ff(y);
            f[r1] = r2;

            v[0].push_back(r2);
        }else if ((int)v[0].size()>0 && (int)v[1].size()>0){
            int x = qu(0),y = qu(1);
            int r1 = ff(x),r2 = ff(y);
            f[r1] = r2;
            v[1].push_back(r2);
        }else return cout<<"NO"<<endl,0;
    }

    if ((int)v[0].size()+(int)v[1].size()<k){
        cout<<"NO"<<endl;
        return 0;
    }

    cout<<"YES"<<endl;
    for (int i = 1;i <= n;i++){
        int r = ff(i);
        bo[r].push_back(i);
    }

    for (int i = 1;i <= n;i++)
        if (!bo[i].empty()){
            cout<<(int)bo[i].size()<<' ';
            for (int x:bo[i]){
                cout<<a[x]<<' ';
            }
            cout<<endl;
        }
    //a[0]==p
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/8404347.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/adgnfega11455/article/details/101824783

智能推荐

PyCharm使用技巧:Compare With(文件比较工具)_pycharm compare with 蓝色-程序员宅基地

文章浏览阅读3.5w次,点赞16次,收藏20次。PyCharm的Compare With提供了文件比较功能,包括比较文件夹和比较文件,功能和文件比较工具beyond compare类似。_pycharm compare with 蓝色

Dolphin social network——海豚社会网络数据集的简单研究_dolphin数据集-程序员宅基地

文章浏览阅读4.4k次。1.海豚社会网络数据摘要: Lusseau等在新西兰对62只宽吻海豚的生活习性进行了长时间的观察,他们研究发现这些海豚的交往呈现出特定的模式,并构造了包含有62个结点的社会网络。如果某两只海豚经常一起频繁活动,那么网络中相应的两个结点之间就会有一条边存在。Dolphin 网络也是复杂网络社区发现与划分的经典用例,其拓扑结构如图所示,该网络记录了62 只海豚之间的联系,共分为2 个家族(社区)。2.数据集内容介绍 数据格式:csv ..._dolphin数据集

免费 TR069 管理系统ACS - XACS_tr069管理系统免费-程序员宅基地

文章浏览阅读2.7w次,点赞7次,收藏15次。TR069管理系统(XACS)基于TR069协议实现的管理系统,可支持海量CPE的管理及测试。免费使用,免费测试,支持标准RPC。实现的内容主要有· 1. CPE集中管理· 2. CPE分类管理· 3. 配置模板管理及自动化下发· 4. CPE软件版本自动升级管理· 5. CPE系统日志自动备份管理· 6. CPE系统配置自动备份管理· 7. ..._tr069管理系统免费

Maven打包编译找不到com.sun.crypto.provider.SunJCE类-程序员宅基地

文章浏览阅读2.9k次。Maven配置    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <c..._com.sun.crypto.providersunjce_provider

PyQt5 打包没有icon图标,百度方法没用,终极解决之道究竟在哪(pyinstaller打包成exe文件,双击打开,没有显示图标)_把pyinstaller 生成的exe移动到别的文件夹,图标消失怎么办-程序员宅基地

文章浏览阅读4.3k次,点赞9次,收藏45次。在分享之前,先爆下粗口,wtfk。太难了,整整折腾了一下午。才搞定。pyqt5打包成exe,程序有图标,但是双击打开的任务栏和窗口都没有显示图标。百度的方法基本上用烂掉了。解决不了。最后在一个犄角旮旯的地方找到了解决方案:问题复现打包命令:pyinstaller -F -w -i favicon.ico update.py程序显示图标了,但是点进去,图标没了!直接在p..._把pyinstaller 生成的exe移动到别的文件夹,图标消失怎么办

Zynq7020_PS端 uart驱动编写-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏22次。刚接触 zynq 网上资料也很少,整起来也比较难受。ps、pl 还有SDK。这些东西第一次用都得了解。如果你是个arm工程师,PL部分可以不用怎么了解,只要学习简单的新建硬件流就可以了。主要学习使用的是SDK。在使用方面还得对SDK进行一些配置。 所以记录自己学习zynq的过程。开发板用的是黑金的。下面开始吧!!!!一、串口初始化XScuGic Intc // 中断XGpioPs g_sGpioInstance; // gpioXUartPs Uart..._ps端 uart

随便推点

[MIMO-OFDM通信系统的频谱效率matlab仿真] -- MATLAB仿真MIMO-OFDM通信系统的频谱利用效率_matlab仿真频分多址频谱利用率-程序员宅基地

文章浏览阅读622次。频谱效率是评价通信系统性能的重要指标之一,本文将基于MATLAB进行MIMO-OFDM通信系统的频谱效率仿真。通过上述步骤,我们成功进行了MIMO-OFDM通信系统的频谱效率仿真,并计算得到了频谱效率。首先,我们需要设置通信系统参数:载波数、子载波数、天线数、调制方式等。[MIMO-OFDM通信系统的频谱效率matlab仿真] – MATLAB仿真MIMO-OFDM通信系统的频谱利用效率。最后,我们对接收信号进行解调、去除循环前缀、FFT变换,并计算频谱效率。_matlab仿真频分多址频谱利用率

运维人最爱的八本书,送给十一不出门的你-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏15次。12闲来无事拾书籍十一长假已经过去一半,今天小编给大家安利几本书,陪宅在家或者旅游在外的同学们度过漫长岁月~( ̄▽ ̄~)~中国数据中心运维管理指针作者 钟景华本书以数据中心为背景,从数据中心全生命周期管理的角度,围绕数据中心运维管理、数据中心监控系统、数据中心基础设施管理三个方面,定义系统概念,描述系统架构确立性能指标,规范设计与施工_数据中心运维必读书籍有哪些

【Ubuntu】命令行安装deb安装包_ubuntu mingling anzhuang deb-程序员宅基地

文章浏览阅读1.6k次。如果ubuntu要安装新软件,已有deb安装包(例如:iptux.deb),但是无法登录到桌面环境。那该怎么安装?答案是:使用dpkg命令。dpkg命令常用格式如下:sudo dpkg -I iptux.deb#查看iptux.deb软件包的详细信息,包括软件名称、版本以及大小等(其中-I等价于--info)sudo dpkg -c iptux.deb#查看iptux.deb软件包中包_ubuntu mingling anzhuang deb

Guava Cache原理_guava cache原理 csdn-程序员宅基地

文章浏览阅读469次。基本用法构建 public static void initCache(LoadingCache cache) throws ExecutionException { for(int i =1;i<=3;i++){ //连接数据源 ,如果缓存没有就读取数据源 cache.get(String.valueOf(i)); } } /** * 获得当前缓存的记录 * @pa_guava cache原理 csdn

记录:多种方法实现文字超出省略号显示 css/js_链接文字超过最大长度省略号显示-程序员宅基地

文章浏览阅读559次。超出文字,变省略号的多种实现方式描述CSS方式实现情况一:一行溢出情况二:多行溢出正常情况(中文)异常情况(英文,数字,符号等)总结JS方式实现问题部分:(英文和其他)最终方式:视觉欺骗描述超出文字变省略号的实现方式有多种。在这里简单列出来几种。然后在最后,根据特殊需求。有【展开全部】式样的需求的实现。CSS方式实现情况一:一行溢出<div class="content1-css"> <div class="contentText1-css">这里是数据,有可能会超过_链接文字超过最大长度省略号显示

Java程序员如何顺利拿下阿里P6的offer?(面试篇)-程序员宅基地

文章浏览阅读175次。本屌现今四年开发经验;前前后后为进阿里面试十次(阿里旗下——蚂蚁金服,天猫的offer都被hr因学历而被拒,最后的菜鸟面幸运的被录用,拿到P6offer,真正的“十面”阿里!)。本文前半部分主要分享面试总结,后半部分分享程序员我个人架构开发之路的学习经验。阿里十面面试总结虽然天猫,蚂蚁金,菜鸟都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面。面试开始会让自我介绍,主要业务架构和技..._csdn资源java高级程序员面试阿里p6必备宝典