답안 #1042021

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1042021 2024-08-02T12:28:33 Z PM1 ZIGZAG (INOI20_zigzag) C++17
0 / 100
710 ms 79952 KB
#include <bits/stdc++.h>
using namespace std;
#define fr first
#define sc second
#define ll long long
const int mxn=3e5+5,szz=(1<<20);
int n,q,a[mxn];
bool aval=0;
ll akhar,fakhar,bakhar,ans;
struct segment{
	ll res[szz],rast[szz],chap[szz],lazysum[szz],lazy[szz],brast[szz],bchap[szz],frast[szz],fchap[szz];
	void getm(int id,int L,int R){
		if(!aval){
			aval=1;
			akhar=rast[id];
			bakhar=brast[id];
			fakhar=frast[id];
			ans=res[id];
		}
		else{
			int cnt=0;
			//cout<<akhar<<" "<<chap[id]<<'\n';
			if(akhar>chap[id]){
				if(fakhar<=akhar && chap[id]<=fchap[id]){
					ans+=bakhar*bchap[id];
					if(brast[id]==R-L)
						cnt=1;
				}
				else if(fakhar<=akhar){
					ans+=bakhar;
				}
				else if(chap[id]<=fchap[id]){
					ans+=bchap[id];
					if(brast[id]==R-L)
						cnt=2;
				}
			}
			if(akhar<chap[id]){
				if(fakhar>=akhar && chap[id]>=fchap[id]){
					ans+=bakhar*bchap[id];
					if(brast[id]==R-L)
						cnt=1;
				}
				else if(fakhar>=akhar){
					ans+=bakhar;
				}
				else if(chap[id]>=fchap[id]){
					ans+=bchap[id];
					if(brast[id]==R-L)
						cnt=2;
				}
			}
			fakhar=(R-L==1)?akhar:frast[id];
			akhar=rast[id];
			ans+=res[id];
			bakhar=(cnt==1)?bakhar+brast[id]:brast[id];
			if(cnt==2)
				bakhar++;
			
		}

	}
	void shift(int id){
		for(int x=id*2;x<=id*2+1;x++){
			rast[x]*=(lazy[id])?-1:1;
			chap[x]*=(lazy[id])?-1:1;
			rast[x]+=lazysum[id];
			chap[x]+=lazysum[id];
			frast[x]*=(lazy[id])?-1:1;
			fchap[x]*=(lazy[id])?-1:1;
			frast[x]+=lazysum[id];
			fchap[x]+=lazysum[id];
			lazysum[x]*=(lazy[id])?-1:1;
			lazysum[x]+=lazysum[id];
			lazy[x]^=lazy[id];
		}

		lazysum[id]=lazy[id]=0;
	}
	void merge(int id,int L,int R,int mid){
		rast[id]=rast[id*2+1];
		chap[id]=chap[id*2];
		frast[id]=(R-mid==1)?rast[id*2]:frast[id*2+1];
		fchap[id]=(mid-L==1)?chap[id*2+1]:fchap[id*2];
		res[id]=res[id*2]+res[id*2+1];
		brast[id]=brast[id*2+1];
		bchap[id]=bchap[id*2];
		if(rast[id*2]>chap[id*2+1]){
			if(frast[id*2]<=rast[id*2] && chap[id*2+1]<=fchap[id*2+1]){
				res[id]+=brast[id*2]*bchap[id*2+1];
				if(brast[id*2+1]==R-mid)
					brast[id]+=brast[id*2];
				if(bchap[id*2]==mid-L)
					bchap[id]+=bchap[id*2+1];
			}
			else if(frast[id*2]<=rast[id*2]){
				res[id]+=brast[id*2];
				if(bchap[id*2]==mid-L)
					bchap[id]++;
			}
		  	else if(chap[id*2+1]<=fchap[id*2+1]){
				res[id]+=bchap[id*2+1];
				if(brast[id*2+1]==R-mid)
					brast[id]++;
			}
		}
		else if(rast[id*2]<chap[id*2+1]){
			if(frast[id*2]>=rast[id*2] && chap[id*2+1]>=fchap[id*2+1]){
				res[id]+=brast[id*2]*bchap[id*2+1];
				if(brast[id*2+1]==R-mid)
					brast[id]+=brast[id*2];
				if(bchap[id*2]==mid-L)
					bchap[id]+=bchap[id*2+1];
			}
			else if(frast[id*2]>=rast[id*2]){
				res[id]+=brast[id*2];
				if(bchap[id*2]==mid-L)
					bchap[id]++;
			}
		  	else if(chap[id*2+1]>=fchap[id*2+1]){
				res[id]+=bchap[id*2+1];
				if(brast[id*2+1]==R-mid)
					brast[id]++;
			}
		}
	}
	void add(int id,int L,int R,int l,int r,int x){
		if(l>=R || L>=r)
			return ;
		if(l<=L && R<=r){
			lazysum[id]+=x;
			rast[id]+=x;
			chap[id]+=x;
			frast[id]+=x;
			fchap[id]+=x;
			if(L+1==R){
				brast[id]=bchap[id]=1;
				res[id]=1;
			}
			return ;
		}
		int mid=(L+R)>>1;
		shift(id);
		add(id*2,L,mid,l,r,x);
		add(id*2+1,mid ,R,l,r,x);
		merge(id,L,R,mid);
		return ;
	}
	void up(int id,int L,int R,int l,int r){
		if(l>=R || L>=r)
			return ;
		if(l<=L && R<=r){
			lazysum[id]*=-1;
			rast[id]*=-1;
			chap[id]*=-1;
			frast[id]*=-1;
			fchap[id]*=-1;
			lazy[id]^=1;
			return ;
		}
		int mid=(L+R)>>1;
		shift(id);
		up(id*2,L,mid,l,r);
		up(id*2+1,mid, R,l,r);
		merge(id,L,R,mid);
		return ;
	}
	void get(int id,int L,int R,int l,int r){
		if(l>=R || L>=r)
			return ;
		if(l<=L && R<=r){
			getm(id,L,R);
			return ;
		}
		int mid=(L+R)>>1;
		shift(id);
		get(id*2,L,mid,l,r);
		get(id*2+1,mid, R,l,r);
		merge(id,L,R,mid);
		return ;
	}
}seg;
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		seg.add(1,1,n+1,i,i+1,a[i]);
	}
	while(q--){
		int l,r,z;
		char ty;
		cin>>ty;
		if(ty=='\\')
			cin>>ty;
		cin>>l>>r;
		if(ty=='+'){
			cin>>z;
			seg.add(1,1,n+1,l,r+1,z);
		}
		else if(ty=='?'){
			aval=0;
			seg.get(1,1,n+1,l,r+1);
			cout<<ans<<'\n';
		}
		else{
			seg.up(1,1,n+1,l,r+1);
		}
	}
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 7512 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 710 ms 79952 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 7512 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 7512 KB Output isn't correct
2 Halted 0 ms 0 KB -