求助:样例过不去,本地调试输出了奇怪的东西

P4513 小白逛公园

critnos @ 2020-07-24 11:09:01

#include<bits/stdc++.h>
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#pragma GCC optimize(3,"Ofast","inline")
#define ls w<<1
#define rs w<<1|1
using namespace std;
inline int read()
{
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
struct seg
{
    int l,r;
    int sum,lsum,rsum,mx;
}t[2000005];
int wz[500005];
seg merge(seg x,seg y)
{
    seg ret;
    ret.sum=x.sum+y.sum;
    ret.lsum=max(x.lsum,x.sum+y.lsum);
    ret.rsum=max(y.rsum,y.sum+x.rsum);
    ret.mx=max(max(x.mx,y.mx),x.rsum+y.lsum);
    return ret;
}
void init(int w,int v)
{
    t[w].sum=t[w].lsum=t[w].rsum=t[w].mx=v;
}
void build(int w,int l,int r)
{
    if(l==r) init(w,read()),wz[l]=w;
    else
    {
        int mid=l+r>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        t[w]=merge(t[ls],t[rs]);
    }
    t[w].l=l,t[w].r=r;
}
void add(int x,int y)
{
    int w=wz[x];
    init(w,y);
    for(w>>=1;w>=1;w>>=1)
    {
        //cout<<w<<endl;
        seg lans=t[ls],rans=t[rs];
        t[w]=merge(lans,rans);
    }   
}
seg ask(int w,int l,int r)
{
    if(t[w].l>=l&&t[w].r<=r) 
    {
        //cout<<t[w].l<<' '<<t[w].r<<endl;
        return t[w];
    }
    if(t[ls].r>=l&&t[rs].l<=r) 
    {
        seg lans=ask(ls,l,r),rans=ask(rs,l,r);
        return merge(lans,rans);
    }
    if(t[ls].r>=l) return ask(ls,l,r);
    return ask(rs,l,r);
}
int main()
{
    int n=read(),m=read(),opt,l,r;
    build(1,1,n);
    while(m--)
    {
        opt=read(),l=read(),r=read();
        if(l>r) swap(l,r);
        //cout<<opt<<' '<<l<<' '<<r<<endl;
        if(opt==1) printf("%d\n",ask(1,l,r).mx);
        else add(l,r);
    }
}

比如那个 add,我输出参数 x,y,居然是反着的?


by critnos @ 2020-07-24 11:11:12

void add(int x,int y)
{
    cout<<x<<' '<<y<<endl;
    int w=wz[x];
    init(w,y);
    for(w>>=1;w>=1;w>>=1)
    {
        //cout<<w<<endl;
        seg lans=t[ls],rans=t[rs];
        t[w]=merge(lans,rans);
    }   
}

by zhjxaoini @ 2020-07-24 11:17:53

@mcyl35

if(l>r) swap(l,r);

这句应该写在 opt==1 的情况里面吧


by critnos @ 2020-07-24 11:19:44

@zhaojinxi thxthx,谢谢大佬


by critnos @ 2020-07-24 11:53:00

thx,过了


|