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

【题意】

在这里输入题意

【题解】

一开始所有的数字单独成一个集合。
然后用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;
}

【Henu ACM Round#20 D】 Devu and Partitioning of the Array的更多相关文章

  1. 【Henu ACM Round#20 F】 Arthur and Brackets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...

  2. 【Henu ACM Round#20 E】Star

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找规律. 1,13,37.... 6n(n-1) + 1 [代码] #include <bits/stdc++.h> # ...

  3. 【Henu ACM Round#20 C】 Eevee

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理处所有的字符串可能的样子. 存在map里面就好. [代码] #include <bits/stdc++.h> usi ...

  4. 【Henu ACM Round#20 B】Contest

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 根据时间和原分数. 算出对应的分数就可以了. [代码] #include <bits/stdc++.h> using n ...

  5. 【Henu ACM Round#20 A】 Fancy Fence

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看有没有(n-2)*180/n等于输入的a就好. [代码] #include <bits/stdc++.h> usin ...

  6. 【Henu ACM Round#15 F】Arthur and Questions

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...

  7. 【Henu ACM Round#24 E】Connected Components

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...

  8. 【Henu ACM Round#24 D】Iterated Linear Function

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...

  9. 【Henu ACM Round#24 C】Quiz

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是这样 先放k-1个,然后空1个,然后再放k-1个.然后再空1个.. 以此类推. 然后如果(n/k)*(k-1)+n%k> ...

随机推荐

  1. HTML&CSS——使用DIV和CSS完成网站首页重构

    1.DIV 相关的技术 Div 它是一个 html 标签,一个块级元素(单独显示一行).它单独使用没有任何意义,必须结合CSS来使用.它主要用于页面的布局. Span 它是一个 html 标签,一个内 ...

  2. Linux部署之批量自动安装系统之测试篇

    1.         客户端从网络启动如下   2.         复制vesamenu.c32文件可解决上面的问题   3.         客户端再次启动   4.         选择第一个进 ...

  3. servlet中Session的用法

    ## (1)什么是Session? 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象).          当浏览器第一次访问服务器时,服务器会创建session对象(该    ...

  4. c标签迭代Map

    <%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" ...

  5. logging.config模块---使用配置文件管理logger

    logging配置文件 一.使用到的模块: logging.config 官方文档: https://docs.python.org/3/library/logging.config.html 非官方 ...

  6. 洛谷1345 [Usaco5.4]奶牛的电信

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  7. HTML一些标记

    4)a标签也可以转换样式为按钮 <a class="btn btn-primary" href="#" role="button"&g ...

  8. 紫书 例题8-15 UVa 12174 (滑动窗口)

    这道题就是给你一n长序列, 然后把这个序列按顺序分成很多段, 每段长s(最前面可以小于s, 只有第一段的后半段, 最后面也同样, 只有最后一段的前半段), 然后要求是每一段里面没有重复的数, 问你有几 ...

  9. python学习--导入自己的包

    定义一个自己的方法包: def myFunc(x): if x > 10: return x else: return -x 在需要的地方导入包: # 导入自定义的方法包 from learn ...

  10. Docker_入门?只要这篇就够了!(纯干货适合0基础小白)

    与sgy一起开启你的Docker之路 关键词: Docker; mac; Docker中使用gdb无法进入断点,无法调试; 更新1: 看起来之前那一版博文中参考资料部分引用的外站链接太多,被系统自动屏 ...