#include <bits/stdc++.h> #define int long long using namespace std; using LL = long long; constexpr int mod = 1e9 + 7; constexpr int INF = 1e18 + 7; constexpr int N = 1e6 + 10; vector<int> zz_word_hint; int n, m, k; int a[N]; int f[N]; signed main() { cin >> n >> m; vector<int> b(n); for (int i = 1; i <= n; i++) { cin >> a[i]; b[i - 1] = a[i]; } sort(b.begin(), b.end()); k = n / 2; multiset<int, greater<int>> down(b.begin(), b.begin() + k); multiset<int> up(b.begin() + k, b.end()); while (m--) { int p, x; cin >> p >> x; if (a[p] > *down.begin()) { up.erase(up.find(a[p])); up.insert(x); a[p] = x; } else { down.erase(down.find(a[p])); down.insert(x); a[p] = x; } if (*down.begin() > *up.begin()) { int x1 = *down.begin(); int x2 = *up.begin(); up.erase(up.begin()); down.erase(down.begin()); up.insert(x1); down.insert(x2); } cout << *up.begin() << "\n"; } return 0; } 这个代码用到了什么算法?
时间: 2024-04-19 09:27:07 浏览: 146
这段代码使用了贪心算法和数据结构中的多重集合(multiset)来解决问题。贪心算法在每一步选择中都采取当前状态下最优的选择,以期望最终得到全局最优解。而多重集合是一种允许重复元素存在的集合,可以方便地进行元素的插入、删除和查找操作。
在这段代码中,首先读入n和m,然后读入n个数存入数组a。接下来,将数组a的前一半元素存入降序多重集合down,后一半元素存入升序多重集合up。然后进入一个循环,每次循环读入p和x,如果a[p]大于down中的最大值,则将a[p]从up中删除,并将x插入up中,并更新a[p]为x;否则将a[p]从down中删除,并将x插入down中,并更新a[p]为x。最后,如果down中的最大值大于up中的最小值,则交换这两个值。每次循环结束后,输出up中的最小值。
所以,这段代码使用了贪心算法和多重集合来实现一种最优化的元素交换操作。
相关问题
下边代码为什么不能编译: #include <bits/stdc++.h> #define int long long using namespace std; const int mod = 1e9 + 7; int k; signed main() { cin >> k; cout << (__int128)k * (k + 1) % mod * (k + 1) / 6 % mod; return 0; }
这段代码在编译时可能会出现错误,因为 `#include <bits/stdc++.h>` 这行代码并不是标准C++的头文件,它是一种非标准的头文件,只能在一些编译器中使用。如果你想使用标准的C++头文件,可以使用具体的头文件,比如 `#include <iostream>` 来代替。
另外,`__int128` 是一个特定编译器扩展的类型,不是标准C++的一部分。如果你希望在其他编译器中编译此代码,你可能需要使用其他方法来处理大整数计算,比如使用字符串或自定义的大整数类。
最后,`signed` 关键字在C++中是可选的,通常用于明确指示 `main()` 函数的返回类型为有符号整数。如果你在编译时遇到关于 `signed` 关键字的错误,可以尝试将其移除或替换为 `int` 类型。
#include<bits/stdc++.h> using namespace std;int main(){long long int a,b,c=1,d=1;cin>>a>>b;for(int i=0;i<=b-1;i++){c*=a;
你的代码似乎没有结束,最后一行缺少分号。另外,你在计算 $a^b$ 的时候可以使用 pow 函数,不需要自己写循环。以下是修正后的代码:
```c++
#include <bits/stdc++.h>
using namespace std;
int main() {
long long int a, b;
cin >> a >> b;
long long int ans = pow(a, b);
cout << ans << endl;
return 0;
}
```
注意,这里使用了 pow 函数,需要包含 `<cmath>` 头文件。
阅读全文