社区讨论

求助 MLE & TLE

P13978数列分块入门 3参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj36wpw
此快照首次捕获于
2025/11/03 19:58
4 个月前
此快照最后确认于
2025/11/03 19:58
4 个月前
查看原帖
想法是分块套平衡树,不知道为什么会导致时空爆炸(尤其是空间的问题完全不理解。。)。
CPP
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
constexpr int BKSIZE=1024,CNT=256,maxn=200007;
long long arr[maxn];
long long lazytag[CNT];
tree<long long,int,less<>,rb_tree_tag,tree_order_statistics_node_update>tr[CNT];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n; cin>>n;
    int tag=0;
    for(int i=1;i<=n;++i)
        cin>>arr[i];
    for(int i=1;i<=n;++i)
        tr[i/BKSIZE][arr[i]]++;
    for(int i=1;i<=n;++i)
    {
        long long opt,l,r,c; cin>>opt>>l>>r>>c;
        if(opt==0)
        {
            if(l/BKSIZE==r/BKSIZE)
            {
                int pos=l/BKSIZE;
                for(int j=l;j<=r;++j)
                {
                    tr[pos][arr[j]+lazytag[pos]]--;
                    arr[j]+=c;
                    tr[pos][arr[j]+lazytag[pos]]++;
                }
            }
            else
            {
                int lpos=l/BKSIZE,rpos=r/BKSIZE;
                int lposr=(lpos+1)*BKSIZE-1;
                int rposl=rpos*BKSIZE;
                // Update for [l,lposr]
                for(int j=l;j<=lposr;++j)
                {
                    tr[lpos][arr[j]+lazytag[lpos]]--;
					if(!tr[lpos][arr[j]+lazytag[lpos]])
						tr[lpos].erase(arr[j]+lazytag[lpos]);
                    arr[j]+=c;
                    tr[lpos][arr[j]+lazytag[lpos]]++;
                }
                // Update for [rposl,r]
                for(int j=rposl;j<=r;++j)
                {
                    tr[rpos][arr[j]+lazytag[rpos]]--;
					if(!tr[rpos][arr[j]+lazytag[rpos]])
						tr[rpos].erase(arr[j]+lazytag[rpos]);
                    arr[j]+=c;
                    tr[rpos][arr[j]+lazytag[rpos]]++;
                }
                // Update for Blocks in (lpos,rpos)
                for(int j=lpos+1;j<rpos;++j)
                    lazytag[j]+=c;
            }
        }
        else
        {
            long long ans=-1'000'000'000'000'000'000LL;
            if(l/BKSIZE==r/BKSIZE)
            {
                int pos=l/BKSIZE;
                for(int j=l;j<=r;++j)
                {
                    if(arr[j]+lazytag[pos]<c)
                        ans=max(ans,arr[j]+lazytag[pos]);
                }
            }
            else
            {
                int lpos=l/BKSIZE,rpos=r/BKSIZE;
                int lposr=(lpos+1)*BKSIZE-1;
                int rposl=rpos*BKSIZE;
                // Query for [l,lposr]
                for(int j=l;j<=lposr;++j)
                {
                    if(arr[j]+lazytag[lpos]<c)
                        ans=max(ans,arr[j]+lazytag[lpos]);
                }
                // Query for [rposl,r]
                for(int j=rposl;j<=r;++j)
                {
                    if(arr[j]+lazytag[rpos]<c)
                        ans=max(ans,arr[j]+lazytag[rpos]);
                }
                // Query for Blocks in (lpos,rpos)
                for(int j=lpos+1;j<rpos;++j)
                {
                    long long target=c-lazytag[j];
                    // if target is greater than the min value
                    if(tr[j].order_of_key(target))
                    {
                        ans=max(ans,tr[j].find_by_order(tr[j].order_of_key(target)-1)->first+lazytag[j]);
                    }
                }
            }
            if(ans==-1'000'000'000'000'000'000LL)
                cout<<-1<<'\n';
            else cout<<ans<<'\n';
        }
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...