线段树求调,WA ON #5
查看原帖
线段树求调,WA ON #5
653286
zhfaz123楼主2023/8/14 13:37

提交记录:这里

代码:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<queue>
#include<deque>
#include<cstring>
#include<string>
#include<set>
#include<utility>
#include<set>
#include<map>
#include<climits>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
constexpr int N=2e5,M=2e5;
#define I using
#define AK namespace
#define IOI std
#define ls (rt<<1)
#define rs (rt<<1|1)
I AK IOI;
int n,m;
using ll=long long;
using cit=const int&;
using cll=const long long&;
struct g
{
    int l,r;
    ll ad,d,mn;
}a[N<<2];
ll b[N+5];
bool sp;
// #define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template<typename T> void inline read(T& x)
{
    int8_t f=1;char ch;x=0;
    ch=getchar();
    while(ch<'0'||ch>'9') ch=='-'?f=-1:f,ch=getchar();
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();x*=f;
    sp=ch==' '?1:0;//快读判空格
}
template<typename T,typename... Arg> void inline read(T& x,Arg& ... arg){read(x);read(arg...);}
void inline pu(cit rt)
{
    a[rt].d=a[ls].d+a[rs].d;
    a[rt].mn=min(a[ls].mn,a[rs].mn);
}//上传标记
void build(cit rt,cit l,cit r)
{
    cit mid=l+r>>1;
    a[rt].l=l;a[rt].r=r;a[rt].ad=0;
    if(l==r)
    {
        a[rt].d=b[l];
        a[rt].mn=b[l];
        return ;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pu(rt);
}
void inline pp(cit rt)
{
    if(a[rt].ad)
    {
        a[ls].d+=a[rt].ad*(a[ls].r-a[ls].l+1);
        a[rs].d+=a[rt].ad*(a[rs].r-a[rs].l+1);
        a[ls].ad+=a[rt].ad;a[rs].ad+=a[rt].ad;
        a[ls].mn+=a[rt].ad;a[rs].mn+=a[rt].mn;
        a[rt].ad=0;
    }
}//下传标记
void ad(cit rt,cit l,cit r,cll k)
{
    cit md=a[rt].l+a[rt].r>>1;
    if(l<=a[rt].l&&a[rt].r<=r)
    {
        a[rt].ad+=k;
        a[rt].d+=(a[rt].r-a[rt].l+1)*k;
        a[rt].mn+=k;
        return ;
    }
    pp(rt);
    if(l<=md) ad(ls,l,r,k);
    if(md<r) ad(rs,l,r,k);
    pu(rt);
}//加
ll qy(cit rt,cit l,cit r)
{
    cit md=a[rt].l+a[rt].r>>1;
    ll ret=LONG_LONG_MAX;
    if(l<=a[rt].l&&a[rt].r<=r)
    {
        return a[rt].mn;
    }
    pp(rt);
    if(l<=md) ret=min(ret,qy(ls,l,r));
    if(md<r) ret=min(ret,qy(rs,l,r));
    pu(rt);
    return ret;
}//求最小值
int main()
{
    int n;
    read(n);
    for(int i=1;i<=n;i++) read(b[i]);
    build(1,1,n);
    read(m);
    for(int i=1;i<=m;i++)
    {
        int l,r;
        read(l);read(r);l++,r++;
        if(sp) 
        {
            ll k;
            read(k);
            if(r<l)
            {
                ad(1,l,n,k);
                ad(1,1,r,k);
            }
            else ad(1,l,r,k);
        }
        else
        {
            ll ret=LONG_LONG_MAX;
            if(r<l)
            {
                ret=min(ret,qy(1,l,n));
                ret=min(ret,qy(1,1,r));
            }
            else ret=min(ret,qy(1,l,r));
            printf("%lld\n",ret);
        }
    }    
    return 0;
}
2023/8/14 13:37
加载中...