社区讨论
WA求条,代码清晰易懂
P10235[yLCPC2024] C. 舞萌基本练习参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3kc6a
- 此快照首次捕获于
- 2025/11/03 20:09 4 个月前
- 此快照最后确认于
- 2025/11/03 20:09 4 个月前
CPP
#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using namespace std;
const int _ = 1e5 + 5;
int n,k,T;
int a[_],b[_];
map <long long,int> Map;
int c[_ << 1];
void update(int x,int k)
{
for(;x <= n;x += lowbit(x))
c[x] += k;
}
int query(int x)
{
int ans = 0;
for(;x;x -= lowbit(x))
ans += c[x];
return ans;
}
bool check(int ans)
{
memset(c,0,sizeof c);
stack <int> s;
int num = 0;
int sum = 1;//分段数量
for(int i = 1;i <= n;i++)
{
num += query(n) - query(a[i]);
if(num > ans)
{
sum++;
while(!s.empty())//还原
{
update(s.top(),-1);
s.pop();
}
num = 0;
}
update(a[i],1);
s.push(a[i]);
}
return sum <= k;
}
int main()
{
ios::sync_with_stdio(false);
cin >> T;
while(T--)
{
Map.clear();
Map[0] = 0;
b[0] = 0;
cin >> n >> k;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
b[i] = a[i];
}
sort(b + 1,b + n + 1);
for(int i = 1;i <= n;i++)
{
if(!Map[b[i]])
Map[b[i]] = Map[b[i - 1]] + 1;
}
for(int i = 1;i <= n;i++)
{
a[i] = Map[a[i]];
// cout << a[i] << " ";
}
int l = 0,r = 1e9;
// cout << check(0) << " ";
while(l < r)
{
int mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...