void solve() {
//前面没有比它强的,和0位置交换
//前面有很多个比它强的,和第一个交换
//找到第一个的下标x
//创建一个辅助节点数组
//分两种情况,交换0和k,交换x和k
//如果x==n了就不交换
//创建一个胜利局数数组
//以u作为冠军,一开始u=0,每次和后面的pk,胜利的stt[u]++;
//ans=std::max(ans,stt[k]),输出答案
int n, k;
std::cin >> n >> k;
k--;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
//找到第一个比a[k]大的节点的位置
int x;
for (x = 0; x < n; x++) {
// = find_if(a.begin(), a.end(), [&](int v) { return v > a[k]; }) - a.begin();
if (a[x] > a[k])break;
}
std::vector<int> pos(n);
//从0到n-1
std::iota(pos.begin(), pos.end(), 0);
int ans = 0;
for (int i : {0, x}) {
//i==0或者i==x;
//i==n,说明没有比它大的
if (i == n) {
continue;
}
//和头交换或者和第一个比它大的x交换
std::swap(pos[i], pos[k]);
std::vector<int> stt(n);
//一开始最强的是pos[0]
for (int j = 1, u = pos[0]; j < n; j++) {
//v=pos[j]表示当前牛
int v = pos[j];
//更换冠军
u = (a[u] > a[v] ? u : v);
//赢的那个牛++
stt[u]++;
}
//交换回来
std::swap(pos[i], pos[k]);
ans = std::max(ans, stt[k]);
}
std::cout << ans << '\n';
}
cf-Global-Round25B
最新推荐文章于 2024-07-15 22:10:26 发布