답안 #1018369

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1018369 2024-07-09T20:43:22 Z AtinaR Growing Trees (BOI11_grow) C++14
0 / 100
195 ms 15972 KB
#include <bits/stdc++.h>

using namespace std;
const long long MAX=1e5+10;
long long niza[MAX],treemin[4*MAX],treemax[4*MAX],treeog[4*MAX];
long long lazy[4*MAX];
long long n,q;
void build(long long node, long long L, long long R)
{
    lazy[node]=0;
    if(L==R)
    {
        treemin[node]=niza[L];
        treemax[node]=niza[L];
        treeog[node]=niza[L];
        return;
    }
    long long mid=(L+R)/2;
    build(2*node,L,mid);
    build(2*node+1,mid+1,R);
    treemin[node]=min(treemin[2*node],treemin[2*node+1]);
    treemax[node]=max(treemax[2*node],treemax[2*node+1]);
    treeog[node]=treeog[2*node]+treeog[2*node+1];
}
void push(long long node, long long L, long long R)
{
    long long mid=(L+R)/2;
    if(lazy[node]==0)return;
    treemin[2*node]+=lazy[node];
    treemin[2*node+1]+=lazy[node];
    treemax[2*node]+=lazy[node];
    treemax[2*node+1]+=lazy[node];
    treeog[2*node]+=(mid-L+1);
    treeog[2*node+1]+=(R-mid);
    lazy[2*node]+=lazy[node];
    lazy[2*node+1]+=lazy[node];
    lazy[node]=0;
}
void update(long long node, long long L, long long R, long long _left, long long _right)
{
    if(L>=_left && R<=_right)
    {
        treemax[node]++;
        treemin[node]++;
        treeog[node]+=(R-L+1);
        lazy[node]++;
        return;
    }
    if(L>_right || R<_left)return;
    long long mid=(L+R)/2;
    push(node,L,R);
    update(2*node,L,mid,_left,_right);
    update(2*node+1,mid+1,R,_left,_right);
    treemax[node]=max(treemax[2*node],treemax[2*node+1]);
    treemin[node]=min(treemin[2*node],treemin[2*node+1]);

    treeog[node]=treeog[2*node]+treeog[2*node+1];
}

long long nobiggerthan(long long node, long long L, long long R, long long x)
{
    if(L==R)return L;
    push(node,L,R);
    long long mid=(L+R)/2;
    if(treemax[2*node+1]<=x)return nobiggerthan(2*node+1,mid+1,R,x);
    else if(treemax[2*node]<=x)return nobiggerthan(2*node,L,mid,x);
    else return 0;
}
long long firstatleast(long long node, long long L, long long R, long long x)
{
    if(L==R)
    {
        return L;
    }
    push(node,L,R);
    long long mid=(L+R)/2;
    if(treemax[2*node]>=x)return firstatleast(2*node,L,mid,x);
    else if(treemax[2*node+1]>=x) return firstatleast(2*node+1,mid+1,R,x);
    else return n;
}
long long getnum(long long node, long long L, long long R, long long x)
{
    if(L==R)
    {
        return treeog[node];
    }
    push(node,L,R);
    long long mid=(L+R)/2;
    if(x>mid)return getnum(2*node+1,mid+1,R,x);
    else return getnum(2*node,L,mid,x);
}
int main()
{
    cin>>n>>q;
    for(long long i=0; i<n; i++)cin>>niza[i];
    sort(niza,niza+n);
    build(1,0,n-1);
    for(long long i=0; i<q; i++)
    {
        char type;
        cin>>type;
        long long a,b;
        cin>>a>>b;
        if(type=='F')
        {
            long long l=firstatleast(1,0,n-1,b);
            if(l==n)continue;
            long long r=min(n-1,l+a-1);
            if(r==n-1)
            {
                update(1,0,n-1,l,n-1);
            }
            long long tmp=getnum(1,0,n-1,r);
            tmp--;

            long long lastfrom=nobiggerthan(1,0,n-1,tmp);
            update(1,0,n-1,l,lastfrom);
            long long too=nobiggerthan(1,0,n-1,tmp+1);
            long long howmanyleft=a-(lastfrom-l+1);
            long long newfrom=too-howmanyleft+1;
            update(1,0,n-1,newfrom,too);
        }
        else
        {
            long long l=firstatleast(1,0,n-1,a);
            long long r=nobiggerthan(1,0,n-1,b);
            cout<<r-l+1<<endl;
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 119 ms 14888 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 6488 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 124 ms 9944 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 136 ms 10124 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 96 ms 12420 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 119 ms 14420 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 102 ms 14672 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 135 ms 15184 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 118 ms 14932 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 195 ms 15972 KB Output isn't correct
2 Halted 0 ms 0 KB -