| 
 | 
 
 
发表于 2023-4-15 13:50:57
|
显示全部楼层
   本楼为最佳答案    
 
 
  看起来你的代码有一处小错误。在 query 函数的参数列表中,int 和参数名称之间缺少一个空格。请修改 query 函数的参数列表,如下所示: 
 
- int query(int u, int l, int r, double k) {
 
 
  复制代码 
 
更正后的完整代码如下: 
- #include <iostream>
 
 - #include <vector>
 
 - #include <algorithm>
 
  
- using namespace std;
 
  
- const int maxn = 1e5 + 10;
 
 - const double eps = 1e-6;
 
  
- int n, m, tot;
 
 - double a[maxn], b[maxn], c[maxn];
 
  
- vector<int> tr[maxn << 2];
 
  
- void pushup(int u) {
 
 -     int ls = u << 1, rs = u << 1 | 1;
 
 -     for (int i = 0, j = 0; i < tr[ls].size() || j < tr[rs].size();) {
 
 -         if (i == tr[ls].size()) tr[u].push_back(tr[rs][j++]);
 
 -         else if (j == tr[rs].size() || a[tr[ls][i]] - b[tr[ls][i]] < a[tr[rs][j]] - b[tr[rs][j]]) {
 
 -             tr[u].push_back(tr[ls][i++]);
 
 -         } else {
 
 -             tr[u].push_back(tr[rs][j++]);
 
 -         }
 
 -     }
 
 - }
 
  
- void build(int u, int l, int r) {
 
 -     tr[u].clear();
 
 -     if (l + 1 == r) {
 
 -         tr[u].push_back(l);
 
 -         return;
 
 -     }
 
 -     int mid = (l + r) >> 1;
 
 -     build(u << 1, l, mid);
 
 -     build(u << 1 | 1, mid, r);
 
 -     pushup(u);
 
 - }
 
  
- void modify(int u, int l, int r, int pos, int val) {
 
 -     if (l + 1 == r) {
 
 -         tr[u].push_back(pos);
 
 -         return;
 
 -     }
 
 -     int mid = (l + r) >> 1;
 
 -     if (mid > pos) modify(u << 1, l, mid, pos, val);
 
 -     else modify(u << 1 | 1, mid, r, pos, val);
 
 -     pushup(u);
 
 - }
 
  
- int query(int u, int l, int r, double k) {
 
 -     if (tr[u].empty()) return -1;
 
 -     if (l + 1 == r) return tr[u][0];
 
 -     int mid = (l + r) >> 1, ans = -1;
 
 -     for (int i = 0; i < tr[u].size(); ++i) {
 
 -         int p = tr[u][i];
 
 -         c[p] = a[p] * k - b[p];
 
 -         if (c[p] > c[ans]) ans = p;
 
 -     }
 
 -     if (ans != -1) return ans;
 
 -     if (k < eps) return -1;
 
 -     if (!tr[u << 1].empty() && a[tr[u << 1][0]] > b[tr[u << 1][0]] / k) {
 
 -         ans = query(u << 1, l, mid, k);
 
 -     }
 
 -     if (ans == -1 && !tr[u << 1 | 1].empty() && a[tr[u << 1 | 1][0]] > b[tr[u << 1 | 1][0]] / k) {
 
 -         ans = query(u << 1 | 1, mid, r, k);
 
 -     }
 
 
  复制代码 
 
 |   
 
 
 
 |