按第一关键字排序后枚举中位数,就变成了判断“左边前K小的和 + 这个中位数 + 右边前K小的和 <= F",其中维护前K小和可以用treap做到。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std; struct node
{
node *ch[];
int sz;
int v;
int r;
int sum;
node(int v = ) : v(v)
{
r = rand();
sz = ;
ch[] = ch[] = NULL;
sum = v;
}
int cmp(int k)
{
return k > v;
}
void maintain()
{
sz = ;
sum = v;
if(ch[] != NULL)
{
sz += ch[]->sz;
sum += ch[]->sum;
}
if(ch[] != NULL)
{
sz += ch[]->sz;
sum += ch[]->sum;
}
}
}; void rotate(node *&o, int d)
{
node *k = o->ch[d^];
o->ch[d^] = k->ch[d];
k->ch[d] = o;
o->maintain();
k->maintain();
o = k;
} void insert(node *&o, int v)
{
if(o == NULL) o = new node(v);
else
{
int d = o->cmp(v);
insert(o->ch[d], v);
if(o->ch[d]->r > o->r) rotate(o, d^);
}
o->maintain();
} void remove(node *&o, int v)
{
if(v == o->v)
{
if(o->ch[] == NULL) o = o->ch[];
else if(o->ch[] == NULL) o = o->ch[];
else
{
int d = o->ch[]->r < o->ch[]->r ? : ;
rotate(o, d);
remove(o->ch[d], v);
}
} else
{
int d = o->cmp(v);
remove(o->ch[d], v);
}
if(o != NULL) o->maintain();
} int query(node *o, int k)
{
int s = o->ch[] == NULL ? : o->ch[]->sz;
int sum = o->ch[] == NULL ? : o->ch[]->sum;
if(s + > k) return query(o->ch[], k);
if(s + == k) return sum + o->v;
if(s + < k) return sum + o->v + query(o->ch[], k - s - );
} void del(node *o)
{
if(o->ch[] != NULL) del(o->ch[]);
if(o->ch[] != NULL) del(o->ch[]);
delete o;
} int main()
{
int n, c, f;
while(scanf("%d%d%d", &n, &c, &f) != EOF)
{
vector<pair<int, int> > a;
for(int i = ; i < c; i++)
{
int x, y;
scanf("%d%d", &x, &y);
a.push_back(make_pair(x, y));
} sort(a.begin(), a.end()); node *r = NULL, *l = NULL;
for(int i = ; i < n / ; i++)
insert(r, a[c - i - ].second);
for(int i = c - n / - ; i >= ; i--)
insert(l, a[i].second);
int ans = -;
for(int i = c - n / - ; i >= n / ; i--)
{
remove(l, a[i].second);
if(query(l, n / ) + query(r, n / ) + a[i].second <= f)
{
ans = a[i].first;
break;
}
insert(r, a[i].second);
} printf("%d\n", ans);
del(l); del(r);
}
return ;
}

POJ 2010 Moo University - Financial Aid treap的更多相关文章

  1. POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

    POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...

  2. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

  3. poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会

    Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6599   A ...

  4. poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  5. poj -2010 Moo University - Financial Aid (优先队列)

    http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U&quo ...

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

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

  7. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  8. POJ 2010 Moo University - Financial Aid 优先队列

    题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...

  9. POJ 2010 Moo University - Financial Aid (优先队列)

    题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...

随机推荐

  1. web.xml常用元素配置

    tomcat服务器: tomcat是一个WEB服务器,所有的j2ee WEB程序可以在此处运行. tomcat服务器是一个符合j2ee标准的WEB服务器.则J2ee的EJB程序无法在此处运行. 如果要 ...

  2. c语言自定义BOOL函数

    C语言中没有BOOL类型变量,它是C++独有的,由于使用BOOL类型可以使代码更具有可读性,很多编程者都在C中自己定义了类似的应用,一般方法有两种: 第一种:采用宏定义方式 typedef int B ...

  3. xml ---DOM操作

    package day03.xml; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; ...

  4. 36、重新复习html和css之二

    (1)由于公司是意大利的网段, (2)而且公司的电脑是保密的, (3)文件发不出去, (4)U盘插不进去. (5)而且我们组的项目整体上已经开发完毕,客户暂时没有什么大的需求, 所以如果我不把这些技术 ...

  5. [Nginx] 在Linux下的启动、停止和重加载

    Nginx的启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 其中-c参数指定配置文件路径.   Nginx的停止 ...

  6. Centos安装lnmp环境

    1:查看环境: [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 [root@10 ...

  7. css响应有media,js响应有这种

    比如,我不想在移动端执行某js特效可以参考(function(doc, win) { var screenWidth = 0, size = 'M', root = doc.documentEleme ...

  8. c#中实现多个接口出现同名同参的方法

    IDictionary接口类同时继承了 IEnumerable<KeyValuePair<TKey, TValue>> 和 IEnumerable这两个接口 public in ...

  9. win10使用技巧

    无法使用内置的管理员账户打开应用的问题命令行里输入:secpol.msc安全设置-本地策略-安全选项点击找到“用户账户控制:用于内置管理员账户的管理员批准”选项.该选项设置为"已启用&quo ...

  10. jquery ajax 前前后后,所有的函数并查询链接

    jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 描述 jQuery.ajax() 执行异步 H ...