为什么主席树只有10分?(悬赏一关注)
查看原帖
为什么主席树只有10分?(悬赏一关注)
658786
STUDENT00楼主2022/11/21 20:00

参考第一篇题解的思路,码风良好。

代码如下:

#include<bits/stdc++.h>
#define ls tree[p].l
#define rs tree[p].r
#define N 200010
using namespace std;
int n,m,f,ans=-1,t[N],cnt,f1[N],f2[N],rt[N];
struct Student{
	int a,b;
} st[N];
struct node{
	int l,r,sum;
} tree[N<<5];
void build(int &p,int l,int r){
	p=++cnt;
	if(l==r) return;
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void update(int &p,int fa,int l,int r,int a){
	p=++cnt;
	tree[p]=tree[fa];
	tree[p].sum++;
	if(l==r) return;
	int mid=l+r>>1;
	if(a<=mid) update(ls,tree[fa].l,l,mid,a);
	else update(rs,tree[fa].r,mid+1,r,a);
}
int query(int l,int r,int a,int b,int c){
	if(l==r) return l;
	int mid=l+r>>1,x=tree[tree[b].l].sum-tree[tree[a].l].sum;
	if(c<=x) return query(l,mid,tree[a].l,tree[b].l,c);
	else return query(mid+1,r,tree[a].r,tree[b].r,c-x);
}
int main(){
	scanf("%d%d%d",&m,&n,&f);
	m>>=1;
	for(int i=1;i<=n;i++) scanf("%d%d",&st[i].a,&st[i].b);
	for(int i=1;i<=n;i++) t[i]=st[i].b;
	sort(t+1,t+n+1);
	int q=unique(t+1,t+n+1)-t-1;
	build(rt[0],1,q);
	for(int i=1;i<=n;i++) update(rt[i],rt[i-1],1,q,lower_bound(t+1,t+q+1,st[i].b)-t);
	for(int i=1;i<=m;i++) f1[i]=f1[i-1]+st[i].b;
	for(int i=n;i>=n-m+1;i--) f2[i]=f2[i+1]+st[i].b;
	for(int i=m+1;i<=n;i++) f1[i]=f1[i-1]+min(0,st[i].b-t[query(1,q,rt[0],rt[i-1],m)]);
	for(int i=n-m;i>=1;i--) f2[i]=f2[i+1]+min(0,st[i].b-t[query(1,q,rt[i],rt[n],m)]);
	for(int i=m+1;i<=n-m;i++){
		if(st[i].b+f1[i-1]+f2[i+1]<=f) ans=max(ans,st[i].a);
	}
	printf("%d",ans);
	return 0;
}
2022/11/21 20:00
加载中...