BZOJ_2947_[Poi2000]促销_堆

Description

Bytelandish连锁超市委托你编写一个程序来模拟一项即将施行的促销活动,该活动的规则如下:
●想要参与的顾客,只需把他的个人资料写在帐单上,并把帐单放入投票箱;
●每天活动结束时,数额最大、最小的两张帐单被取出,付款数额最大的顾客将获得一笔奖金,价值为取出的两张帐单的数额之差;
●为了不重复计算,取出的两张帐单不再放回箱子,而剩下的帐单仍保留在箱中,进行第二天的活动。
超市每天的营业额很大,因此可假定:每天活动结束时,箱中至少有两张帐单以供取出。
你的任务是根据每天投入箱中的帐单,计算出这项促销活动期间超市付出的奖金总数额。
任务:
编写一个程序,完成下列工作:
●读入投入箱中的帐单的信息;
●算出促销活动期间的奖金总额;

Input

 
第一行是一个整数 n(1 <= n <= 5000),表示促销活动历时的天数。
以下的n行,每行包含若干由空格分隔的非负整数。第i+1行的数表示在第i天投入箱子的账单金额。每行的第一行是一个整数k(0 <= k <= 105), 表示当日账单的数目。后面的k个正整数代表这k笔账单的金额,均小于106
整个活动中涉及到的账单笔数不会超过106

Output

唯一一行是一个整数,等于整个促销活动中应该付出的奖金总额。

Sample Input

5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2

Sample Output

19


可以,不多BB,看代码。

代码:

/*#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
int rd() {
int x=0; char ch=nc();
while(ch<'0'||ch>'9') ch=nc();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=nc();
return x;
}
#define N 1000050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
long long ans;
int ch[N][2],f[N],rt,reimu,val[N],siz[N],n,cnt;
int newnode(int v) {val[++reimu]=v; return reimu;}
void pushup(int p) {siz[p]=siz[ls]+siz[rs]+1;}
void rotate(int x) {int y=f[x],z=f[y],k=get(x);ch[y][k]=ch[x][!k];f[ch[y][k]]=y;ch[x][!k]=y;f[y]=x;f[x]=z;if(z)ch[z][ch[z][1]==y]=x;if(rt==y)rt=x;pushup(y);pushup(x);}
void splay(int x,int y) {for(int d;(d=f[x])!=y;rotate(x)) if(f[d]!=y) rotate(get(x)==get(d)?d:x);}
void insert(int x) {
int l,r,p=rt;
while(p) {
if(val[p]<x) l=p,p=rs;
else r=p,p=ls;
}
splay(l,0); splay(r,rt);
p=newnode(x); ch[r][0]=p; f[p]=r; siz[p]=1; pushup(r); pushup(l);
}
int pre() {int p=ch[rt][0]; while(rs) p=rs;return p;}
int nxt() {int p=ch[rt][1]; while(ls) p=ls;return p;}
int find(int x) {
int p=rt;
while(1) {
if(siz[ls]>=x) p=ls;
else {
x-=siz[ls]+1; if(!x) return p; p=rs;
}
}
}
void solve() {
int mx,mn,p;
p=find(2); mn=val[p]; splay(p,0); int p1=1,p2=nxt(); splay(p1,0); splay(p2,rt); ch[p2][0]=0; pushup(p2); pushup(p1);
p=find(cnt); mx=val[p]; splay(p,0); p1=pre(),p2=2; splay(p1,0); splay(p2,rt); ch[p2][0]=0; pushup(p2); pushup(p1);
ans=ans+mx-mn;
}
int main() {
scanf("%d",&n);
val[1]=-10000000; siz[1]=1; f[1]=2;
val[2]=10000000; siz[2]=2; ch[2][0]=1; rt=2;
reimu=2;
int i,K,x;
for(i=1;i<=n;i++) {
scanf("%d",&K);
while(K--) {
scanf("%d",&x); insert(x); cnt++;
}
solve(); cnt-=2;
}
printf("%lld\n",ans);
}*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
__gnu_pbds::priority_queue<int>p;
__gnu_pbds::priority_queue<int,greater<int> >q;
int n,vis1[1000050],vis2[1000050];
long long ans;
int main() {
scanf("%d",&n);
int K,i,x;
for(i=1;i<=n;i++) {
scanf("%d",&K);
while(K--) {
scanf("%d",&x);
if(vis1[x]) vis1[x]--;
else q.push(x);
if(vis2[x]) vis2[x]--;
else p.push(x);
}
while(vis1[q.top()]) vis1[q.top()]--,q.pop();
while(vis2[p.top()]) vis2[p.top()]--,p.pop();
ans+=p.top()-q.top(); vis1[p.top()]++; vis2[q.top()]++; q.pop(); p.pop();
}
printf("%lld\n",ans);
}

BZOJ_2947_[Poi2000]促销_堆的更多相关文章

  1. 【bzoj2947】[Poi2000]促销

    2947: [Poi2000]促销 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 181  Solved: 120[Submit][Status][D ...

  2. bzoj2947: [Poi2000]促销

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 178  Solved: 119[Submit][Status][Discuss] Descriptio ...

  3. BZOJ 2947 Poi2000 促销 set

    标题效果:特定n天,首先插入一些每天.然后去掉最高值和最低值,要付出最大的值-至少值价格.乞讨n总天数支付的价格 堆/段树/平衡树光秃秃的标题 #include <set> #includ ...

  4. 数据结构&算法(一)_堆、栈(堆栈)、队列、链表

    堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做 ...

  5. 数据结构与算法(Java版)_堆

    完全二叉树叫做堆. 完全二叉树就是最后一个节点之前不允许有不满的节点,就是不允许有空洞. 可以使用数组来做完全二叉树(堆). 堆分为大顶堆和小顶堆.大顶堆就是根节点上的数字是最大的,小顶堆就是根节点上 ...

  6. [bzoj1572][Usaco2009 Open]工作安排Job_贪心_堆

    工作安排 Job bzoj-1572 Usaco-2009 Open 题目大意:题目链接. 注释:略. 想法: 我们将任务按照截止时间排序,枚举任务的同时顺便记录出已经做了多少任务(当前时间). 对于 ...

  7. [bzoj2802][Poi2012]Warehouse Store_贪心_堆

    Warehouse Store bzoj-2802 Poi-2012 题目大意:一家商店的连续n天内,每一天会进货$a_i$个,有且只有一个客人回来买$b_i$个,问至多满足多少人. 注释:$1\le ...

  8. BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题

    Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...

  9. jvm 虚拟机参数_堆内存分配

    1.参数 -XX:+PrintGC 只要遇到 GC 就会打印日志 -XX:+UseSerialGC 配置串行回收器 -XX:+PrintGCDetails 查看详细信息,包括各个区的情况 -XX:+P ...

随机推荐

  1. hexo干货系列:(八)hexo文章自动隐藏侧边栏

    前言 使用Jacman主题的时候发现打开具体文章后,侧边栏还是会展示,我想要的效果是自动隐藏侧边栏,并且展示目录.但是当我修改了主题配置文件里面close_aside属性为true的时候,发现侧边栏隐 ...

  2. python+RobotFramework

    今天有人问我,她想在在robot里面用到数据库的一个值的随机数,但是不知道怎么实现,我用python写了一段代码链接数据库给表中所需的字段的值取随机数,代码如下: import random,pymy ...

  3. HDU4462稻草人

    l问题描述:有一块N*N的玉米田(N<=50),给定K个(X,Y)的坐标位置(K<=10)和相应的覆盖范围,请问,至少在这K个位置中选择几个放置稻草人,能保证玉米田全被覆盖?     #i ...

  4. BZOJ 2763: [JLOI2011]飞行路线 【SPFA】

    Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Al ...

  5. 洛谷P1145 约瑟夫

    题目描述 n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人,k个好人站在一起,k个坏人站在一起.从第一个好人开始数数.你要确定一个最小 ...

  6. JS把数字金额转换成中文大写数字的函数

    //把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿" ...

  7. Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

    前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...

  8. 匈牙利游戏(codevs 1269)

    题目描述 Description Welcome to the Hungary Games! The streets of Budapest form a twisted network of one ...

  9. python-web apache mod_python 模块的安装

    安装apache 下载mod_python 编译安装 测试 下载mod_python,下载地址:mod_python 在GitHub 上面, 下载之后:目录结构如下: 安装依赖: #查找可安装的依赖 ...

  10. Linux kernel 内核学习路线

    看了下各位大神的推荐路线,总结如下: 0. 跟着项目走: 1. 学会用.熟练用linux系统: 2. Linux Kernel Development. 3. Understanding the Li ...