按第一关键字排序后枚举中位数,就变成了判断“左边前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 ;
}

最新文章

  1. (404) 未找到 获取StatusCode状态码
  2. HashSet与HashMap的区别
  3. VS2010 VB 连接数据库SQL2005
  4. 最新java数组的详解
  5. GCC 编译命令
  6. Appium:通过wifi连接Android设备
  7. JQuery 实现返回顶部
  8. Excel数据导入至Dataset中
  9. java处理数据库不支持的emoji表情符
  10. shell 关于字符切割 cut
  11. LY.JAVA面向对象编程思想概述
  12. CSAPP lab2 二进制拆弹 binary bombs phase_6
  13. 转:纯CSS实现“鼠标移过显示层”效果
  14. android复制包需要修改的几个地方
  15. Linux设置开机启动项
  16. linux学习第十七天(NFS、AUTOFS文件共享配置,DNS配置)
  17. Linux下以特定用户运行命令
  18. 〖Linux〗VIM youcompleteme 自动补全 #include 文件名称
  19. rk3188 双屏异显分析
  20. 在linux通过kubeadm搭建kubernetes群集

热门文章

  1. Android Activity 四种启动模式
  2. VS2008下,aspx页面设计模式消失,只有黑白字体
  3. 读取excel数据,并统计输出Frame版本
  4. highcharts 柱状图 动态加载
  5. SpringBoot-Learning
  6. c#自制视屏监控
  7. 利用qmake生成Makefile文件
  8. centos 安装 nginx
  9. 2013xlsm格式文件处理
  10. iOS(本地通知与远程通知)