社区讨论
求Debug
P10235[yLCPC2024] C. 舞萌基本练习参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @ltpe7yvi
- 此快照首次捕获于
- 2024/03/13 14:01 2 年前
- 此快照最后确认于
- 2024/03/13 16:37 2 年前
线段树维护逆序对+二分
常规做法发现暴力清 会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 条回复,欢迎继续交流。
正在加载回复...