求助 调了几小时了
  • 板块P4198 楼房重建
  • 楼主iqer
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/8 12:58
  • 上次更新2023/11/4 04:21:50
查看原帖
求助 调了几小时了
527629
iqer楼主2021/10/8 12:58
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int n, m, x, y;
struct node{
    double maxs;
    int len;
}tree[maxn << 2];
int push_up(int l, int r, int t, int v){
    if(l == r)return tree[t].maxs > v;
    int mid = (l + r) >> 1;
    if(tree[t << 1].maxs <= v)return push_up(mid + 1, r, t << 1 | 1, v);
    return push_up(l, mid, t << 1, v) + tree[t].len - tree[t << 1].len;
}
void maintain(int l, int r, int t){
    tree[t].maxs = max(tree[t << 1].maxs, tree[t << 1 | 1].maxs);
    int mid = (l + r) >> 1;
    if(tree[t << 1].maxs >= tree[t << 1 | 1].maxs)tree[t].len = tree[t << 1].len;
    else tree[t].len = tree[t << 1].len + push_up(mid + 1, r, t << 1 | 1, tree[t << 1].maxs);
}
void update(int l, int r, int q, double v, int t){
    if(q < l || r < q)return;
    if(l == q && q == r){
        tree[t].maxs = v;
        tree[t].len = 1;
        return;
    }
    int mid = (l + r) >> 1;
    update(l, mid, q, v, t << 1);
    update(mid + 1, r, q, v, t << 1 | 1);
    maintain(l, r, t);
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    freopen("in.txt", "r", stdin);
    cin >> n >> m;
    for(int i = 1; i <= m; ++i){
        cin >> x >> y;
        double tmp = (double) y / x;
        update(1, n, x, tmp, 1);
        cout << tree[1].len << endl;
    }
    return 0;
}
2021/10/8 12:58
加载中...