ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「JOISC 2021 Day1」饮食区

2021-07-01 16:04:05  阅读:195  来源: 互联网

标签:opt 255555 int sum Day1 seg JOISC 2021 qwq


考虑将所有所有修改和询问离线下来,并且将队列编号看成时刻。这样就可以将操作一二的修改拆开,变成在\(L_i\)时刻加入数据结构,在\(R_i+1\)时刻弹出数据结构。

考虑使用一棵普通的线段树维护,下标为操作的顺序(因为操作也是有顺序的),每个节点维护当前区间元素的个数(可以是负数),区间最大元素子段和,区间加入元素的个数。

然后修改就单点修改,查询的时候线段树上二分即可。

int n,m,q;
int opt[255555],L[255555],R[255555],C[255555],K[255555];
struct seg
{
    int v,l,s;
    inline seg(int V=0,int L=0,int S=0): v(V),l(L),s(S) {}
    inline void upd(const seg &A){v+=A.v;l=max(l+A.v,A.l);s+=A.s;}
}t[1111111];
int ans[255555];
vector<pair<seg,int>>md[255555];
vector<pii>qu[255555];
inline seg upd(const seg &A,const seg &B)
{
    return seg(A.v+B.v,max(A.l+B.v,B.l),A.s+B.s);
}
inline void push_up(int x)
{
    t[x]=upd(t[x<<1],t[x<<1|1]);
}
void modify(int p,int l,int r,int x,const seg &k)
{
    if(l==r) {t[x]=k;return;}
    int mid=(l+r)>>1;
    if(p<=mid) modify(p,l,mid,x<<1,k);
    else modify(p,mid+1,r,x<<1|1,k);
    push_up(x);
}
void query(int p,int l,int r,int x,seg &sum)
{
    if(l==r) 
    {
        sum.upd(t[x]);
        return;
    }
    int mid=(l+r)>>1;
    if(p<=mid) query(p,l,mid,x<<1,sum);
    else sum.upd(t[x<<1]),query(p,mid+1,r,x<<1|1,sum);
}
int query_k(int l,int r,int x,int k)
{
    if(l==r) return l;
    int mid=(l+r)>>1;
    if(t[x<<1].s>=k) return query_k(l,mid,x<<1,k);
    else return query_k(mid+1,r,x<<1|1,k-t[x<<1].s);
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m>>q;
    R(i,1,q)
    {
        cin>>opt[i];
        if(opt[i]==1)
        {
            cin>>L[i]>>R[i]>>C[i]>>K[i];
            md[L[i]].pb(mkp(seg(K[i],K[i],K[i]),i));
            md[R[i]+1].pb(mkp(seg(0,0,0),i));
        }
        if(opt[i]==2)
        {
            cin>>L[i]>>R[i]>>K[i];
            md[L[i]].pb(mkp(seg(-K[i],0,0),i));
            md[R[i]+1].pb(mkp(seg(0,0,0),i));
        }
        if(opt[i]==3)
        {
            cin>>L[i]>>R[i];    
            qu[L[i]].pb(mkp(R[i],i));
        }
    }
    R(t,1,n)
    {
        for(const auto &qwq:md[t]) modify(qwq.se,1,q,1,qwq.fi);
        for(const auto &qwq:qu[t])
        {
            seg sum;
            query(qwq.se,1,q,1,sum);
            //printf("v:%lld l:%lld\n",sum.v,sum.l);
            ckmax(sum.v,sum.l);
            if(sum.v>=qwq.fi)
            {
                int k=sum.s-sum.v+qwq.fi;
                //printf("s:%lld v:%lld\n",sum.s,sum.v);
                ans[qwq.se]=C[query_k(1,q,1,k)];
            }
        }
    }
    R(i,1,q) if(opt[i]==3) cout<<ans[i]<<'\n';
}

标签:opt,255555,int,sum,Day1,seg,JOISC,2021,qwq
来源: https://www.cnblogs.com/hizeci/p/14959126.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有