zk卡时间求助
查看原帖
zk卡时间求助
521276
张凯_巨大楼主2021/12/8 17:04
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,bl;
int ad[3010],vl[100010];
int b[1010][3010];
int s[3010],sz;
inline void out(int n)
{
    if(n<0)
    {
        putchar('-');
        n=-n;
    }
    if(n>=10)
    {
        out(n/10);
    }
    putchar(n%10+'0');
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
int op,l,r,v;
int il,ir;
int cheak(int x)
{
    int ret=lower_bound(s+1,s+sz+1,x)-s-1;
    for(int i=il;i<=ir;i++)
    {
        if(b[i][1]>=x-ad[i])
        {
            continue;
        }
        if(b[i][bl]<x-ad[i])
        {
            ret+=bl;
            continue;
        }
        ret+=lower_bound(b[i]+1,b[i]+bl+1,x-ad[i])-b[i]-1;
    }
    return ret;
}
void query()
{
    int ml=-(1<<30),mr=(1<<30),mid;
    il=l/bl+1;
    ir=r/bl-1;
    sz=0;
    if(l/bl==r/bl)
    {
        for(int i=l;i<=r;i++)
        {
            s[++sz]=vl[i]+ad[i/bl];
            ml=max(ml,vl[i]+ad[i/bl]);
            mr=min(mr,vl[i]+ad[i/bl]);
        }
    }
    else
    {
        for(int i=l;i<l/bl*bl+bl;i++)
        {
            s[++sz]=vl[i]+ad[i/bl];
            ml=max(ml,vl[i]+ad[i/bl]);
            mr=min(mr,vl[i]+ad[i/bl]);
        }
        for(int i=r/bl*bl;i<=r;i++)
        {
            s[++sz]=vl[i]+ad[i/bl];
            ml=max(ml,vl[i]+ad[i/bl]);
            mr=min(mr,vl[i]+ad[i/bl]);
        }
    }
    sort(s+1,s+sz+1);
    for(int i=il;i<=ir;i++)
    {
        ml=max(ml,b[i][1]+ad[i]);
        mr=min(mr,b[i][bl]+ad[i]);
    }
    while(ml<mr)
    {
        mid=(ml+mr>>1);
        if(cheak(mid)>v)
        {
            mr=mid-1;
        }
        else
        {
            ml=mid;
        }
    }
    out(ml);
}
void maintain(int x)
{
    for(int i=x*bl;i<x*bl+bl;i++)
    {
        b[x][i%bl+1]=vl[i];
    }
    sort(b[x]+1,b[x]+bl+1);
}
void add()
{
    if(l/bl==r/bl)
    {
        for(int i=l;i<=r;i++)
        {
            vl[i]+=v;
        }
        maintain(l/bl);
    }
    else
    {
        for(int i=l;i<l/bl*bl+bl;i++)
        {
            vl[i]+=v;
        }
        maintain(l/bl);
        for(int i=r/bl*bl;i<=r;i++)
        {
            vl[i]+=v;
        }
        maintain(r/bl);
        for(int i=l/bl+1;i<r/bl;i++)
        {
            ad[i]+=v;
        }
    }
}
int main()
{
    n=read();
    m=read();
    bl=17*sqrt(n);
    for(int i=1;i<=n;i++)
    {
        vl[i]=read();
        b[i/bl][i%bl+1]=vl[i];
    }
    while(m--)
    {
        op=read();
        l=read();
        r=read();
        v=read();
        if(op==1)
        {
            if(r-l+1<v)
            {
                out(-1);
                continue;
            }
            query();
        }
        if(op==2)
        {
            add();
        }
    }
    return 0;
}

zk卡时间卡成了0分,宝贝们快来帮帮zk~

2021/12/8 17:04
加载中...