博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2010 Moo University - Financial Aid treap
阅读量:7187 次
发布时间:2019-06-29

本文共 2562 字,大约阅读时间需要 8 分钟。

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

#include 
#include
#include
#include
#include
using namespace std;struct node{ node *ch[2]; int sz; int v; int r; int sum; node(int v = 0) : v(v) { r = rand(); sz = 1; ch[0] = ch[1] = NULL; sum = v; } int cmp(int k) { return k > v; } void maintain() { sz = 1; sum = v; if(ch[0] != NULL) { sz += ch[0]->sz; sum += ch[0]->sum; } if(ch[1] != NULL) { sz += ch[1]->sz; sum += ch[1]->sum; } }};void rotate(node *&o, int d){ node *k = o->ch[d^1]; o->ch[d^1] = 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^1); } o->maintain();}void remove(node *&o, int v){ if(v == o->v) { if(o->ch[0] == NULL) o = o->ch[1]; else if(o->ch[1] == NULL) o = o->ch[0]; else { int d = o->ch[0]->r < o->ch[1]->r ? 0 : 1; 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[0] == NULL ? 0 : o->ch[0]->sz; int sum = o->ch[0] == NULL ? 0 : o->ch[0]->sum; if(s + 1 > k) return query(o->ch[0], k); if(s + 1 == k) return sum + o->v; if(s + 1 < k) return sum + o->v + query(o->ch[1], k - s - 1);}void del(node *o){ if(o->ch[0] != NULL) del(o->ch[0]); if(o->ch[1] != NULL) del(o->ch[1]); delete o;}int main(){ int n, c, f; while(scanf("%d%d%d", &n, &c, &f) != EOF) { vector
> a; for(int i = 0; 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 = 0; i < n / 2; i++) insert(r, a[c - i - 1].second); for(int i = c - n / 2 - 1; i >= 0; i--) insert(l, a[i].second); int ans = -1; for(int i = c - n / 2 - 1; i >= n / 2; i--) { remove(l, a[i].second); if(query(l, n / 2) + query(r, n / 2) + a[i].second <= f) { ans = a[i].first; break; } insert(r, a[i].second); } printf("%d\n", ans); del(l); del(r); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/BMan/p/3843497.html

你可能感兴趣的文章
常用 Git 命令清单
查看>>
Programming Ability Test学习 1016. 部分A+B (15)
查看>>
配置IIS
查看>>
JavaScript图片等比例缩放
查看>>
Oracle学习操作(5)触发器
查看>>
vim编辑器和bash算术运算入门
查看>>
守护线程(Daemon Thread)
查看>>
在商城系统开发时遇到商品的多级分类,为增强扩展性,子类可以任意添加,此类问题数据库如何设计...
查看>>
我在csdn有一个新家啦
查看>>
LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods
查看>>
【Python学习笔记】-冒泡排序、插入排序、二分法查找
查看>>
linux进程管理之进程创建(三)
查看>>
DS第五章学习小结
查看>>
java基础---面向对象
查看>>
51nod - 1022【四边形不等式优化DP】
查看>>
3月3日(6) Climbing Stairs
查看>>
STL学习笔记-- list
查看>>
Unity 2D人物运动不协调的检查方法(本人专用)
查看>>
oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
查看>>
textview第一次出现不可滚动文本,但是点击出现键盘,键盘落下,就可以滚动问题...
查看>>