堆
首先这道题不可二分,自己YY一下挺显然的。
把每个人按照成绩排序,从大往小扫,用三个可删除的堆 q 1 , q 2 , q 3 q1,q2,q3 q1,q2,q3维护。 q 1 , q 3 q1,q3 q1,q3分别维护当前位置左右的前 k k k大, q 2 q2 q2维护左边不是前 k k k大的,相当于 q 1 q1 q1的后备。
具体实现见代码:
#include<queue>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200005
#define F inline
using namespace std;
typedef long long LL;
struct data{
int x; LL w; }a[N];
struct Q{
priority_queue<LL> q,d;
F void push(LL x){
q.