社区讨论
关于今晚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 条回复,欢迎继续交流。
正在加载回复...