http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3963

题意:给出一个n个数的序列,可以在其中找一个子序列建堆,并且堆中的父亲结点j和孩子结点i满足sj ≤ si and j < i。问要分配所有的数到堆里面,最少可以建多少个堆。

思路:对于每一个数,如果前面有小于等于它的数并且那个数的左右孩子还没满,那么就可以放在它的下面。考虑最优情况,就应该是每次插入到左右孩子还没满的,并且小于等于当前枚举的数的最大的数,然后插入到这个数后面。

因此可以用set来保存结点,每次都二分查找一下,如果没找到就建新的堆,找到了就插在它后面。

可以用并查集来保存关系。

 #include <bits/stdc++.h>
using namespace std;
#define N 100010
struct node {
int val, id, cnt;
bool operator < (const node &rhs) const {
if(rhs.val != val) return val < rhs.val;
if(rhs.id != id) return id > rhs.id; // 大的id优先,因为val相同的话,要使得二分可以返回val
return cnt > rhs.cnt;
}
};
int fa[N], a[N];
set<node> se;
vector<int> ans[N]; int Find(int x) { if(x == fa[x]) return x; return fa[x] = Find(fa[x]); } int main() {
int t; scanf("%d", &t);
while(t--) {
int n; scanf("%d", &n);
se.clear(); int k = ;
for(int i = ; i <= n; i++) scanf("%d", &a[i]), a[i] = -a[i], fa[i] = i;
for(int i = ; i <= n; i++) {
node now = (node) { a[i], i, };
set<node>::iterator it = se.lower_bound(now);
// lower_bound返回大于等于now的元素,设成负数,可以变成返回小于等于now的元素
if(it != se.end()) {
int x = it->val, y = it->id, z = it->cnt;
se.erase(it);
if(z - ) se.insert((node) {x, y, z - });
fa[i] = Find(y);
}
se.insert(now);
}
for(int i = ; i <= n; i++) if(fa[i] == i) ans[i].clear(), k++;
for(int i = ; i <= n; i++) ans[Find(i)].push_back(i);
printf("%d\n", k);
for(int i = ; i <= n; i++) {
if(fa[i] != i) continue;
printf("%d", ans[i].size());
for(int j = ; j < ans[i].size(); j++) printf(" %d", ans[i][j]);
puts("");
}
}
return ;
}

ZOJ 3963:Heap Partition(贪心+set+并查集)的更多相关文章

  1. zoj 3963 Heap Partition(并查集,贪心,二分)

    Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence S = { ...

  2. ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。

    Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...

  3. ZOJ 3963 Heap Partition(multiset + stl自带二分 + 贪心)题解

    题意:给你n个数字s1~sn,要你把它们组成一棵棵二叉树,对这棵二叉树来说,所有节点来自S,并且父节点si<=子节点sj,并且i<j,问你树最少几棵二叉数.树 思路:贪心.我们往multi ...

  4. Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)

    Luogu 1525 [NOIP2010]关押罪犯 (贪心,并查集) Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨 ...

  5. zoj-3963 Heap Partition(贪心+二分+树状数组)

    题目链接: Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence ...

  6. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  7. hdu 2480 贪心+简单并查集

    Steal the Treasure Time Limit: 10000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. POJ-1456 Supermarket(贪心,并查集优化)

    Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Descript ...

  9. 1202. [HNOI2005]狡猾的商人【贪心 或 并查集】

    Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 ...

随机推荐

  1. eXtremeDB -- the shared memory 80error

    The customers got the shared memory 80error on AIX environment; utility truss is used to track the d ...

  2. 【C++】【TinyXml】xml文件的读写功能使用——写xml文件

    TinyXml工具是常用比较简单的C++中xml读写的工具 需要加载 #include "TinyXml\tinyxml.h" 在TinyXML中,根据XML的各种元素来定义了一些 ...

  3. ControlTemplate

    ControlTemplate:外观定制 <Window.Resources> <ControlTemplate x:Key="CheckBoxControlTemplat ...

  4. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...

  5. Delphi 10.2可以开发Linux桌面应用了

    原始地址 https://community.embarcadero.com/blogs/entry/firemonkey-on-linux    Delphi Linux编译器已经发布,现在无需等待 ...

  6. liunx 系统 一键安装

    本文转自:http://hi.baidu.com/iamcyh/item/e777eb81ba90ed5a26ebd9b0 linux VPS环境(MySQL/Apache/PHP/Nginx)一键安 ...

  7. rdlc水晶报表在wpf里的使用

    1引用程序集 Microsoft.ReportViewer.WinForms 2 xaml 命名空间 xmlns:rv="clr-namespace:Microsoft.Reporting. ...

  8. 【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第八章 FluidMoveBehavior完全解析之一漂浮移动 好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend ...

  9. Cindy components(配色很不错)

    https://sourceforge.net/projects/tcycomponents/

  10. Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法

    原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据 ...