社区讨论

求Debug

P10235[yLCPC2024] C. 舞萌基本练习参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@ltpe7yvi
此快照首次捕获于
2024/03/13 14:01
2 年前
此快照最后确认于
2024/03/13 16:37
2 年前
查看原帖
线段树维护逆序对+二分
常规做法发现暴力清 00 会TLE,所以打了个懒标记简易版。
但是就Wa了
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5+10;
const int INF = 0x3f3f3f3f;
const int nxt[2][4] = {{0,1,0,-1},{1,0,-1,0}};
const int mod = 98244353;

int t , n , k ,m,a[N],b[N],tree[N],tag[N];
int ans = INF;

void update(int pos,int l,int r,int x){
	if(tag[pos]){
		tree[pos] = 0;
		tag[pos<<1] = tag[pos<<1|1] = 1;
		tag[pos] = 0;
	}
	if(l == r){
		tree[pos] ++;
		return;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) update(pos<<1,l,mid,x);
	else update(pos<<1|1,mid+1,r,x);
	tree[pos] = tree[pos<<1]+tree[pos<<1|1];
}

int query(int pos,int l,int r,int x,int y){
	if(tag[pos]){
		tree[pos] = 0;
		tag[pos<<1] = tag[pos<<1|1] = 1;
		tag[pos] = 0;
	}
	if(x <= l && r <= y) return tree[pos];
	int mid = (l + r) >> 1,res = 0;
	if(x <= mid) res += query(pos<<1,l,mid,x,y);
	if(mid < y) res += query(pos<<1|1,mid+1,r,x,y);
	return res;
}

int check(int x){
	tag[1] = 1;
	int cnt = 1, sum = 0;
	for(int i= 1; i <= n; i++){
		int v = lower_bound(b+1,b+m+1,a[i]) - b;
		int t = query(1,1,m,v+1,m);
		if(sum + t <= x)sum+=t;
		else tag[1] = 1,sum = 0,cnt++;
		if(cnt > k) return 0;
		update(1,1,m,v);
	}
	return 1;
}

signed main(){
	scanf("%lld",&t);
	while(t--){
		ans = INF;
		scanf("%lld%lld",&n,&k);
		for(int i = 1; i <= n; i++)
			scanf("%lld",&a[i]),b[i] = a[i];
		sort(b+1,b+n+1);
		m = unique(b+1,b+n+1) - b - 1;
		int l = 0, r = n*(n+1)/2;
		while(r - l > 1){
			int mid = (l + r) >> 1;
			if(check(mid)) r = mid;
			else l = mid;
		}
		if(check(l)) printf("%lld\n",l);
		else printf("%lld\n",r);		
	}
}

回复

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

正在加载回复...