社区讨论
WA on #4 玄关求条(代码有注释)
P10235[yLCPC2024] C. 舞萌基本练习参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2ulgy
- 此快照首次捕获于
- 2025/11/03 19:49 4 个月前
- 此快照最后确认于
- 2025/11/03 19:49 4 个月前
错误信息:
wrong answer On line 1 column 5, read 6, expected 9.代码:
已开 long long
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,k;
int a[N];
int s[N],kd;//离散化使用
struct BIT{
int c[N];
void clear(){memset(c,0,sizeof(c));}
int lowbit(int x){return x&(-x);}
void add(int k,int x){//BIT单点加
while(k<=kd){
c[k]+=x;
k+=lowbit(k);
}
}
int query(int k){//BIT区间求和
int res=0;
while(k>=1){
res+=c[k];
k-=lowbit(k);
}
return res;
}
}tr;
bool check(int mid){
int i=kd;
int nk=k;//为防止改变原变量的值,新建一个变量,直接在新变量上操作
int prv=kd;//这一段的开始位置,方便清空
tr.clear();
while(true){
int inv=0;
while(i>=1){
inv+=tr.query(a[i]-1);
if(inv>mid) break;
tr.add(a[i],1);
i--;
}
nk--;
if(nk<0) return false;
if(i==0) return true;
for(int j=prv;j>=i+1;j--) tr.add(a[j],-1);
prv=i;
}
}
void solve(){
cin>>n>>k;
kd=0;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=a[i];
//离散化
sort(s+1,s+1+n);
map<int,int> mp;
for(int i=1;i<=n;i++) if(!mp[s[i]]) mp[s[i]]=++kd;
for(int i=1;i<=n;i++) a[i]=mp[a[i]];
//二分答案
int l=0,r=2e10;
while(l<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
main(){
int T;
cin>>T;
while(T--) solve();
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...