线段树板子只过样例求调/hack 玄关
查看原帖
线段树板子只过样例求调/hack 玄关
206423
焚魂楼主2025/1/23 14:03

RT

#include<bits/stdc++.h>
    
using namespace std;
    
long long t;
const long long N = 2e5 + 10;
long long n,m;
long long a[N],max1[500010],max2[500010];
long long num1[500010],num2[500010];
struct node {
    long long x,y;
};

void up(long long k) {
    max1[k] = max2[k] = num1[k] = num2[k] = 0;
    set<long long,greater<long long> > tq;
    tq.insert(max1[k * 2]);
    tq.insert(max2[k * 2]);
    tq.insert(max1[k * 2 + 1]);
    tq.insert(max2[k * 2 + 1]);
    set<long long>::iterator it = tq.begin();
    max1[k] = *it;
    if(max1[k * 2] == *it) num1[k] += num1[k * 2];
    if(max2[k * 2] == *it) num1[k] += num2[k * 2];
    if(max1[k * 2 + 1] == *it) num1[k] += num1[k * 2 + 1];
    if(max2[k * 2 + 1] == *it) num1[k] += num2[k * 2 + 1];
    it++;
    if(*it != 0) {
        max2[k] = *it;
        if(max1[k * 2] == *it) num2[k] += num1[k * 2];
        if(max2[k * 2] == *it) num2[k] += num2[k * 2];
        if(max1[k * 2 + 1] == *it) num2[k] += num1[k * 2 + 1];
        if(max2[k * 2 + 1] == *it) num2[k] += num2[k * 2 + 1];
    }
}

void build(long long k,long long l,long long r) {
    if(l == r) {
        max1[k] = a[l];
        num1[k] = 1;
        return;
    }
    long long mid = (l + r) >> 1;
    build(k * 2,l,mid);
    build(k * 2 + 1,mid + 1,r);
    up(k);
}

void modify(long long k,long long l,long long r,long long pos,long long v) {
    if(l > pos || r < pos) return;
    if(l == r && l == pos) {
        max1[k] = a[l] = v;
        max2[k] = 0;
        num1[k] = 1;
        num2[k] = 0;
        return ;
    }
    long long mid = (l + r) >> 1;
    modify(k * 2,l,mid,pos,v);
    modify(k * 2 + 1,mid + 1,r,pos,v);
    up(k);
}

node query1(long long k,long long l,long long r,long long x,long long y) {
    if(l > y || r < x) return {0,0};
    if(l >= x && r <= y) return {max1[k],max2[k]};
    long long mid = (l + r) >> 1;
    node res = query1(k * 2,l,mid,x,y);
    node tmp = query1(k * 2 + 1,mid + 1,r,x,y);
    if(res.x > tmp.x) {
        if(res.y >= tmp.x) return res;
        else return {res.x,tmp.x};
    }
    else if(res.x < tmp.x) {
        if(tmp.y >= res.x) return tmp;
        else return {tmp.x,res.x};
    }
    else {
        if(res.y > tmp.y) return res;
        else return tmp;
    }
}

long long query2(long long k,long long l,long long r,long long x,long long y,long long v) {
    if(l > y || r < x) return 0;
    if(l >= x && r <= y) {
        if(v == max1[k]) return num1[k];
        else if(v == max2[k]) return num2[k];
        else return 0;
    }
    long long mid = (l + r) >> 1;
    long long res = 0;
    res = query2(k * 2,l,mid,x,y,v) + query2(k * 2 + 1,mid + 1,r,x,y,v);
    return res;
}
    
void solve() {
    cin >> n >> m;
    for(long long i = 1;i <= n;i++) cin >> a[i];
    build(1,1,n);
    for(long long i = 1;i <= m;i++) {
        long long pd,x,y;
        cin >> pd >> x >> y;
        if(pd == 1)
            modify(1,1,n,x,y);
        else {
            node tmp = query1(1,1,n,x,y);
            if(tmp.y == 0) cout << 0 << '\n';
            else cout << query2(1,1,n,x,y,tmp.y) << '\n';
        }
    }
}
    
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    t = 1;
    while(t--) solve();
    
    return 0;
}
2025/1/23 14:03
加载中...