제출 #1360158

#제출 시각아이디문제언어결과실행 시간메모리
1360158hyyhGrowing Trees (BOI11_grow)C++20
100 / 100
695 ms14228 KiB
#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <unordered_map>
#include <cstdlib>

#define int long long

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x),end(x)

int const N = 2e5+10;

struct Node{
    int sum;
    int lazy;

    Node() : sum(0),lazy(0) {}
};

Node segment[4*N];
int si;

int arr[N];

void push(int node,int l,int r){
    if(l != r){
        segment[node*2].lazy += segment[node].lazy;
        segment[node*2+1].lazy += segment[node].lazy;
        int md = l+(r-l)/2;
        segment[node*2].sum += segment[node].lazy*(md-l+1);
        segment[node*2+1].sum += segment[node].lazy*(r-md);
        segment[node].lazy = 0;
    }
}

void builder(int node,int l,int r){
    if(l == r) segment[node].sum = arr[l];
    else{
        int md = l+(r-l)/2;
        builder(node*2,l,md);
        builder(node*2+1,md+1,r);
        segment[node].sum = segment[node*2].sum + segment[node*2+1].sum;
    }
}

void update(int node,int l,int r,int ql,int qr,int val){
    push(node,l,r);
    if(l >= ql && r <= qr){
        //cout << node << " " << l << " " << r << " " << ql << " " << qr << " " << val << endl;
        segment[node].lazy += val;
        segment[node].sum += val*(r-l+1);
        push(node,l,r);
    }
    else if(l > qr || r < ql) return;
    else{
        int md = l+(r-l)/2;
        update(node*2,l,md,ql,qr,val);
        update(node*2+1,md+1,r,ql,qr,val);
        segment[node].sum = segment[node*2].sum+segment[node*2+1].sum;
    }
}

void update(int l,int r,int val){
    if(r < l) return;
    update(1,1,si,l,r,val);
}

int query(int node,int l,int r,int ql,int qr){
    push(node,l,r);
    if(l >= ql && r <= qr) return segment[node].sum;
    else if(l > qr || r < ql) return 0;
    else{
        int md = l+(r-l)/2;
        int q1 = query(node*2,l,md,ql,qr);
        int q2 = query(node*2+1,md+1,r,ql,qr);
        return q1+q2;
    }
}

int query(int l,int r){
    return query(1,1,si,l,r);
}

int segmentlower(int x){
    int l = 1;
    int r = si+1;
    while(l < r){
        int md = l+(r-l-1)/2;
        if(query(md,md) < x) l = md+1;
        else r = md;
    }
    return l;
}

int segmentupper(int x){
    int l = 1;
    int r = si+1;
    while(l < r){
        int md = l+(r-l-1)/2;
        if(query(md,md) <= x) l = md+1;
        else r = md;
    }
    return l;
}

signed main(){
    int n;cin >> n;
    si = n;
    int q;cin >> q;
    for(int i{1};i <= n;i++){
        cin >> arr[i];
    }
    sort(arr+1,arr+1+n);
    builder(1,1,n);
    for(int i{};i < q;i++){
        char c;cin >> c;
        // for(int i{1};i <= n;i++){
        //     cout << query(i,i) << " ";
        // }
        // cout << endl;
        if(c == 'F'){
            int a,b;cin >> b >> a;
            int p1 = segmentlower(a);
            if(p1 == n+1) continue;
            int endpos = min(n,p1+b-1);
            int endval = query(endpos,endpos);
            int valbegin = segmentlower(endval);
            int valend = segmentupper(endval)-1;
            int remain = endpos-valbegin;
            update(p1,valbegin-1,1);
            update(max(valbegin,valend-remain),valend,1);
        }
        else{
            int a,b;cin >> a >> b;
            int p1 = segmentlower(a);
            int p2 = segmentupper(b);
            cout << p2-p1 << endl;
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…