优先队列太好用了手写啥呀

poj1456 经过贪心专题的洗礼以后这题根本就不叫题啊。。。按时间大到小排每次取最大就好

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std; struct node
{
int v,d;
}a[];
bool cmp(node n1,node n2){return n1.d>n2.d;}
priority_queue<int>q;
int main()
{
int n,mmax=;
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].v,&a[i].d), mmax=max(mmax,a[i].d);
sort(a+,a+n+,cmp); int tp=,ans=;
while(!q.empty())q.pop();
for(int i=mmax;i>=;i--)
{
while(tp<=n&&a[tp].d>=i) q.push(a[tp].v), tp++;
if(!q.empty()) ans+=q.top(), q.pop();
}
printf("%d\n",ans);
}
return ;
}

poj1456

poj2442 这题还是很有价值的。一开始想了个貌似很对的做法,就是把每一行排完序和第一个作差,差值压进小根堆里面,堆顶出来以后和之前出去的合并,然后用两个LL的变量记录状态判重,结果后来发现只要m>=3就会有循环,然后就会重复,强行map判定又会多删。最后就是两两合并,因为只有两行所以可以省掉一个n,就能过了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std; int a[],c[][];
struct node
{
int x,y,d1,d2;bool op;
friend bool operator>(node n1,node n2)
{
return (n1.d1+n1.d2)>(n2.d1+n2.d2);
}
};priority_queue<node,vector<node>,greater<node> >q;
void ins(int x,int y,int d1,int d2,bool op)
{
node t;
t.x=x;t.y=y;t.op=op;
t.d1=d1;t.d2=d2;q.push(t);
} void merge(int n)
{
while(!q.empty())q.pop();
ins(,,c[][],c[][],false);
for(int i=;i<=n;i++)
{
node t=q.top();q.pop();
a[i]=t.d1+t.d2; if(t.x<n)ins(t.x,t.y+,c[][t.x],c[][t.y+],true);
if(t.y<n&&t.op==false)ins(t.x+,t.y,c[][t.x+],c[][t.y],false);
}
for(int i=;i<=n;i++)c[][i]=a[i];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m,n,sum=;
scanf("%d%d",&m,&n);
for(int j=;j<=n;j++)scanf("%d",&a[j]);
sort(a+,a+n+);sum+=a[];
for(int j=;j<=n;j++)c[][j]=a[j]-a[]; for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)scanf("%d",&a[j]);
sort(a+,a+n+);sum+=a[];
for(int j=;j<=n;j++)c[][j]=a[j]-a[];
merge(n);
} for(int i=;i<n;i++)printf("%d ",sum+c[][i]);
printf("%d\n",sum+c[][n]);
}
return ;
}

poj2442

bzoj1150: [CTSC2007]数据备份Backup ->环形版 bzoj2151: 种树

合并果子就算了

bzoj4198 这个想一想就可以发现对应一个k叉的哈夫曼树嘛。。深度较小的话就加一个变量表示合并的次数,相同情况合并合并次数较小的就好。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL; struct node
{
LL x;int id,mr;
friend bool operator>(node n1,node n2)
{
if(n1.x==n2.x)return n1.mr>n2.mr;
return n1.x>n2.x;
}
};priority_queue<node,vector<node>,greater<node> >q;
void insert(LL x,int id,int mr)
{
node t;
t.x=x;t.id=id;t.mr=mr;
q.push(t);
} struct edge
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
int li,deper;LL sum,c[];
void dfs(int x,int dep)
{
if(x<=li)
{
sum+=((LL)dep)*c[x];
deper=max(dep,deper);
return ;
}
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
dfs(y,dep+);
}
} int main()
{
int n,k;node t,p;
scanf("%d%d",&n,&k);li=n;
for(int i=;i<=n;i++)
scanf("%lld",&c[i]), insert(c[i],i,);
while((n-)%(k-)!=) insert(,++n,); int cc=(n-)/(k-);
len=;memset(last,,sizeof(last));
for(int i=;i<=cc;i++)
{
t.x=;t.id=++n;t.mr=;
for(int j=;j<=k;j++)
{
p=q.top();q.pop();
t.x+=p.x;t.mr+=p.mr;
ins(t.id,p.id);
}
q.push(t);
} sum=;deper=;
dfs(q.top().id,);
printf("%lld %d\n",sum,deper);
return ;
}

bzoj4198

0x17 二叉堆的更多相关文章

  1. 0x17二叉堆之超市

    题目链接:https://www.acwing.com/problem/content/147/ 容易想到一个贪心策略:在最优解中,对于每个时间(天数) t,应该在保证不卖出过期商品的前提下,尽量卖出 ...

  2. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  3. codevs 3110 二叉堆练习3

    3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...

  4. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

  6. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  7. 二叉堆(二)之 C++的实现

    概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...

  8. 二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...

  9. 二叉堆(binary heap)

    堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...

随机推荐

  1. BPM控制控件的隐藏与显示

    在BPM官方给的属性中控件属性DisplayRule中设置条件控制显示或者隐藏的时候,只能控制选中的,标题也要重新设置,这样就比较麻烦,不如自己来写javascript代码. 举一个简单的例子: 通过 ...

  2. javascript中作用域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 用户 'NT Service\MSSQLServerOLAPService' 登录失败

    初学SSAS,部署微软官方示例项目AdventureWorksDW2012Multidimensional时出现错误:用户 'NT Service\MSSQLServerOLAPService' 登录 ...

  4. eclipse离线安装pydev

    首先,下载去http://pydev.org/下载Python的Eclipse插件PyDev. 目前的最新版是PyDev 2.7.1.zip,将压缩文件解压出来.得到features和plugins两 ...

  5. The features of Swift

    The features of Swift are designed to work together to create a language that is powerful, yet fun t ...

  6. 这里介绍两种将矩阵写入TXT文件的方法。

    方法1 fid = fopen('data.txt','wt'); % data.txt为写入文件名 matrix = M; % M为要存储的矩阵 [m,n]=size(matrix); for i= ...

  7. IT级别

    IT领袖:年入过亿(例如任正非.马化腾.李彦宏.丁磊.马云等,包括期权股票以及投资理财等收入.) IT大哥:年入千万(级别次于以上几位大佬的公司老板,不缺钱,普遍对上一条里的人物羡慕嫉妒恨.) IT精 ...

  8. sh脚本文件

    echo `date +%F`  打印当前日期  用于写备份脚本按照名字命名

  9. vue中使用base64进行加解密

    vue进行Base64加解密 背景 项目中需要对特殊字符进行处理,避免json和数据库的特殊字符(""等)冲突,刚好学了信息安全,干脆整个加解密,wkk.. 使用步骤 打开dos, ...

  10. Edit Distance FZU-1434

    题目大意: 给你两个字符串A,B,和以下三种操作: 1.删除一个字符 2.插入一个字符 3.把一个字符改变成另一个字符 求使A变成B所需要的最少的操作: 我刚开始的思路是以为求出最长公共子序列,然后对 ...