社区讨论

关于今晚ABC E

灌水区参与者 4已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@m2g86g3z
此快照首次捕获于
2024/10/19 21:59
去年
此快照最后确认于
2025/11/04 23:51
4 个月前
查看原帖
为啥用权值树状数组+二分会WA,用multiset就过了啊。
CPP
#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
#define int long long
int lowbit(int x){
	return x&-x;
}
int n=0,k;
const int N=1e6+5;
struct node{
	int a,b;
}p[N];
bool operator<(const node&x,const node&y){
	return x.a<y.a;
}
struct xds{
	int s[N];
	void upd(int x,int k){
		while(x<N){
			s[x]+=k;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x){
			ans+=s[x];x-=lowbit(x);
		}
		return ans;
	}

}seg[3];
void sol(){
	int mx=1e18;
	up(i,1,n){
		seg[1].upd(p[i].b,-(seg[1].query(p[i].b)-seg[1].query(p[i].b-1)));
		seg[2].upd(p[i].b,-(seg[2].query(p[i].b)-seg[2].query(p[i].b-1)));
	}
	n=k=0;
	cin>>n>>k;
	up(i,1,n) cin>>p[i].a;
	up(i,1,n) cin>>p[i].b;
	sort(p+1,p+n+1);
	int cnt=0;
	up(i,1,k-1){
		seg[1].upd(p[i].b,1);
		seg[2].upd(p[i].b,p[i].b);
	}
	up(i,k,n){
		int l=1,r=N-5,ans=0;
		while(l<=r){
			int mid=(l+r)>>1;
			if(seg[1].query(mid)>=k-1){
				r=mid-1;ans=mid;
			}else{
				l=mid+1;
			}
		}
//		cout<<ans<<' '<<seg[2].query(ans)<<'\n';
		mx=min(mx,(seg[2].query(ans)+p[i].b)*p[i].a*1ll);
		seg[1].upd(p[i].b,1);
		seg[2].upd(p[i].b,p[i].b);
	}
	cout<<mx<<'\n';return;
}
int32_t main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t;
	cin>>t;
	while(t--){
		sol();
	}	
	
	return 0;
}
//tomxi

回复

12 条回复,欢迎继续交流。

正在加载回复...