题解

2 条题解

  • 0
    @ 2025-06-10 18:13:10
    #include<cstdio>
    #include<cctype>
    const int M=6e4+5;
    int n,m,w1[M],w2[M];
    inline char read_c(){
        char s;while(!isalpha(s=getchar()));return s;
    }
    inline int read(){
        int n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;
    }
    inline void write(int n){
        static char s[15];int top(0);while(s[++top]=n%10^48,n/=10);while(putchar(s[top]),--top);putchar(10);
    }
    struct data{
        int w[2][2];
        inline int*operator[](const int&x){
            return w[x];
        }
    }t[M<<2];
    inline int min(const int&a,const int&b){
        return a>b?b:a;
    }
    inline data Merge(data a,const int&x,const int&y,data b){
        data ans;
        ans[0][0]=min(a[0][1]+b[1][0]+min(x,y),min(a[0][0]+b[1][0],a[0][1]+b[0][0])+x+y);
        ans[1][0]=min(a[1][1]+b[1][0]+min(x,y),min(a[1][0]+b[1][0],a[1][1]+b[0][0])+x+y);
        ans[0][1]=min(a[0][1]+b[1][1]+min(x,y),min(a[0][0]+b[1][1],a[0][1]+b[0][1])+x+y);
        ans[1][1]=min(a[1][1]+b[1][1]+min(x,y),min(a[1][0]+b[1][1],a[1][1]+b[0][1])+x+y);
        return ans;
    }
    inline void update(const int&u,const int&L,const int&R){
        const int&mid=L+R>>1;t[u]=Merge(t[u<<1],w1[mid],w2[mid],t[u<<1|1]);
    }
    inline void Build(const int&u,const int&L=1,const int&R=n){
        if(L==R)return void(t[u][1][1]=read());
        const int&mid=L+R>>1;Build(u<<1,L,mid);Build(u<<1|1,mid+1,R);update(u,L,R);
    }
    inline void Mdf(const int&u,const int&x,const int&w,const int&L=1,const int&R=n){
        if(L==R)return void(t[u][1][1]=w);
        const int&mid=L+R>>1;x<=mid?Mdf(u<<1,x,w,L,mid):Mdf(u<<1|1,x,w,mid+1,R);update(u,L,R);
    }
    inline void Update(const int&u,const int&x,const int&L=1,const int&R=n){
        const int&mid=L+R>>1;if(x!=mid)x<=mid?Update(u<<1,x,L,mid):Update(u<<1|1,x,mid+1,R);update(u,L,R);
    }
    inline data Qry(const int&u,const int&l,const int&r,const int&L=1,const int&R=n){
        if(l<=L&&R<=r)return t[u];
        const int&mid=L+R>>1;if(r<=mid)return Qry(u<<1,l,r,L,mid);if(l>mid)return Qry(u<<1|1,l,r,mid+1,R);
        return Merge(Qry(u<<1,l,r,L,mid),w1[mid],w2[mid],Qry(u<<1|1,l,r,mid+1,R));
    }
    signed main(){
        n=read();m=read();for(int i=1;i<n;++i)scanf("%d",w1+i);for(int i=1;i<n;++i)scanf("%d",w2+i);Build(1);
        for(int i=1;i<=m;++i){
            char s=read_c();
            if(s=='C'){
                int x0,y0,x1,y1;x0=read();y0=read();x1=read();y1=read();
                if(y0==y1)Mdf(1,y0,read());else(x0==1?w1:w2)[min(y0,y1)]=read(),Update(1,min(y0,y1));
            }
            if(s=='Q'){
                int L,R;L=read();R=read();write(Qry(1,L,R)[1][1]);
            }
        }
    }
    
  • 0
    @ 2015-05-04 19:17:09

    这题正确率高达100%!!!

  • 1

信息

ID
1950
难度
7
分类
(无)
标签
递交数
42
已通过
10
通过率
24%
被复制
2
上传者