是代码错了,还是我本来就思路错了,感谢大佬指点
  • 板块P4314 CPU 监控
  • 楼主DeNeRATe
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/8/9 15:35
  • 上次更新2023/11/6 20:50:49
查看原帖
是代码错了,还是我本来就思路错了,感谢大佬指点
38171
DeNeRATe楼主2020/8/9 15:35
//P4314
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x7fffffff
using namespace std;
const LL MAXN=1e5+10;

LL Tag1[MAXN<<2],Tag2[MAXN<<2],Max[MAXN<<2],Pre[MAXN<<2];
LL Total,Test,u,v,w,Num[MAXN];
char Opt;
bool Jud[MAXN<<2];

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

inline LL Read() {
    LL Temp=0,Fac=1;
    char Ch=getchar();
    while(Ch<'0' || Ch>'9') { 
		if(Ch=='-') { Fac=-1; } 
		Ch=getchar(); 
	}
    while(Ch>='0' && Ch<='9') { 
		Temp=(Temp<<1)+(Temp<<3)+Ch-'0'; 
		Ch=getchar(); 
	}
    return Fac*Temp;
}

inline void Push_up(LL X,LL L,LL R) {
    Max[X]=max(Max[Lson],Max[Rson]);
    Pre[X]=max(Pre[Lson],Pre[Rson]);
}

inline void Push_down(LL X,LL L,LL R) {
    if(Tag2[X]!=-INF && !Jud[X]) {
        Tag2[Lson]=Tag2[Rson]=Tag2[X];
        Jud[Lson]=Jud[Rson]=false;
        Max[Lson]=Max[Rson]=Tag2[X];
        Pre[Lson]=max(Pre[Lson],Tag2[X]); Pre[Rson]=max(Pre[Rson],Tag2[X]);
        Jud[X]=true;
    } else if(Tag1[X]!=0) {
        Tag1[Lson]+=Tag1[X]; Tag1[Rson]+=Tag1[X];
        Max[Lson]+=Tag1[X]; Max[Rson]+=Tag1[X];
        Pre[Lson]=max(Pre[Lson],Max[Lson]); Pre[Rson]=max(Pre[Rson],Max[Rson]);
        Tag1[X]=0;
    }
}

inline void Build(LL X,LL L,LL R) {
    Tag1[X]=0; Tag2[X]=-INF; Jud[X]=false;
    if(L==R) {
        Pre[X]=Max[X]=Num[L];
        return;
    }
    LL Mid=(L+R)>>1;
    Build(Lson,L,Mid); Build(Rson,Mid+1,R);
    Push_up(X,L,R);
}

inline void Add(LL X,LL L,LL R,LL From,LL To,LL Temp) {
//	cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
//	cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
//	cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
//	cout<<endl;
    if(L>=From && R<=To) {
        if(Tag2[X]!=-INF) { Tag2[X]+=Temp; Jud[X]=false; }
        else { Tag1[X]+=Temp; }
        Max[X]+=Temp;
        Pre[X]=max(Pre[X],Max[X]+Temp);
        return ;
    }
    LL Mid=(L+R)>>1;
    Push_down(X,L,R);
    if(From<=Mid) { Add(Lson,L,Mid,From,To,Temp); }
    if(To>Mid) { Add(Rson,Mid+1,R,From,To,Temp); }
    Push_up(X,L,R);
}

inline void Change(LL X,LL L,LL R,LL From,LL To,LL Temp) {
//	cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
//	cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
//	cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
//	cout<<endl;
    if(L>=From && R<=To) {
        Max[X]=Tag2[X]=Temp; Jud[X]=false;
        Pre[X]=max(Pre[X],Temp);
        Tag1[X]=0;
        return;
    }
    LL Mid=(L+R)>>1;
    Push_down(X,L,R);
    if(From<=Mid) { Change(Lson,L,Mid,From,To,Temp); }
    if(To>Mid) { Change(Rson,Mid+1,R,From,To,Temp); }
    Push_up(X,L,R);
}

inline LL Get_MAX(LL X,LL L,LL R,LL From,LL To) {
//	cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
//	cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
//	cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
//	cout<<endl;
    if(L>=From &&  R<=To) { return Max[X]; }
    LL Mid=(L+R)>>1,Res=-INF;
    Push_down(X,L,R);
    if(From<=Mid) { Res=max(Res,Get_MAX(Lson,L,Mid,From,To)); }
    if(To>Mid) { Res=max(Res,Get_MAX(Rson,Mid+1,R,From,To)); }
    Push_up(X,L,R);
    return Res;
}

inline LL Get_PRE(LL X,LL L,LL R,LL From,LL To) {
//	cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
//	cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
//	cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
//	cout<<endl;
    if(L>=From && R<=To) { return Pre[X]; }
    LL Mid=(L+R)>>1,Res=-INF;
    Push_down(X,L,R);
    if(From<=Mid) { Res=max(Res,Get_PRE(Lson,L,Mid,From,To)); }
    if(To>Mid) { Res=max(Res,Get_PRE(Rson,Mid+1,R,From,To)); }
    Push_up(X,L,R);
    return Res;
}

inline void Debug(LL X,LL L,LL R) {
	cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
	cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
	cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
	cout<<endl;
	if(L==R) return;
	LL Mid=(L+R)>>1;
	Debug(Lson,L,Mid); Debug(Rson,Mid+1,R);
}

int main() {
    //File();
    Total=Read();
    FOR(i,1,Total) { Num[i]=Read(); }
    Build(1,1,Total);
    Test=Read();
    while(Test--) {
		Opt=getchar();
        u=Read(); v=Read();
//    	printf("%c %lld %lld\n",Opt,u,v);
        if(Opt=='Q') { printf("%lld\n",Get_MAX(1,1,Total,u,v)); }
        else if(Opt=='A') { printf("%lld\n",Get_PRE(1,1,Total,u,v)); }
        else if(Opt=='P') { w=Read(); Add(1,1,Total,u,v,w); }
        else if(Opt=='C') { w=Read(); Change(1,1,Total,u,v,w); }
//        Debug(1,1,Total);
    }
    //fclose(stdin); fclose(stdout);
    system("pause");
    return 0;
}
2020/8/9 15:35
加载中...