社区讨论

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 条回复,欢迎继续交流。

正在加载回复...