听灌多(有人想调题吗,玄关)
  • 板块灌水区
  • 楼主oyoham
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/24 10:30
  • 上次更新2024/9/24 16:33:56
查看原帖
听灌多(有人想调题吗,玄关)
957618
oyoham楼主2024/9/24 10:30
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pint pair<int,int>
#define f first
#define s second
#define mp make_pair
#define aF(begin,end,step,name) for(int name=begin;name<=end;name+=step)
#define oF(B,E,N) aF(B,E,1,N)
#define af(B,E,S) aF(B,E,S,i)
#define of(B,E) af(B,E,1)
#define tF(E,N) oF(1,E,N)
#define tf(E) of(1,E)
#define nF(N) tF(n,N)
#define nf() tf(n)
#define GF(x,ep) for(int ep=h[x];ep;ep=nxt[ep]) 
#define Gf(x) GF(x,ep)
#define gF(ep) GF(x,ep)
#define gf() Gf(x)
#define inf 1145141919810
inline ll read(){
	ll x=0;
	short f=1;
	char c=getchar();
	while(c>57||c<48){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c<58&&c>47){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x<0ll) putchar(45),x=~x+1;
	if(x>9ll) write(x/10);
	putchar(x%10|48);
}
#define L 2100005
int n=read(),m;
int lp[L],rp[L],s[L],v1[L],v11[L],c1[L],v2[L],v21[L],c2[L],lz[L],lz1[L],lz2[L];
#define ls (id<<1)
#define rs (ls|1)
#define len(i) (rp[i]-lp[i]+1)
void pu(int id){
	s[id]=s[ls]+s[rs];
	v1[id]=max(v1[ls],v1[rs]);
	v2[id]=min(v2[ls],v2[rs]);
	v11[id]=max(v1[ls]==v1[rs]?-inf:v1[ls]+v1[rs]-v1[id],max(v11[ls],v11[rs]));
	v21[id]=min(v2[ls]==v2[rs]?inf:v2[ls]+v2[rs]-v2[id],min(v21[ls],v21[rs]));
	c1[id]=(v1[id]==v1[ls])*c1[ls]+(v1[id]==v1[rs])*c1[rs];
	c2[id]=(v2[id]==v2[ls])*c2[ls]+(v2[id]==v2[rs])*c2[rs];
}
void effect(int id,int v){
	s[id]+=v*len(id);
	v1[id]+=v;
	v2[id]+=v;
	if(v11[id]!=-inf)v11[id]+=v;
	if(v21[id]!=inf)v21[id]+=v;
	lz[id]+=v;
	if(lz1[id]!=-inf)lz1[id]+=v;
	if(lz2[id]!=inf)lz2[id]+=v;
}
void effect1(int id,int v){
	if(v2[id]>=v)return;
	s[id]+=(v-v2[id])*c2[id];
	lz2[id]=max(lz2[id],v);
	if(v11[id]==v2[id]) v11[id]=v;
	if(v1[id]==v2[id]) v1[id]=v;
	v2[id]=v;
	lz1[id]=v;
}
void effect2(int id,int v){
	if(v1[id]<=v)return;
	s[id]+=(v-v1[id])*c1[id];
	lz1[id]=min(lz1[id],v);
	if(v1[id]==v21[id]) v21[id]=v;
	if(v1[id]==v2[id]) v2[id]=v;
	v1[id]=v;
	lz2[id]=v;
}
void pd1(int id){
	if(lp[id]==rp[id])return;
	effect1(ls,lz1[id]);
	effect1(rs,lz1[id]);
	lz1[id]=-inf;
}
void pd2(int id){
	if(lp[id]==rp[id])return;
	effect1(ls,lz2[id]);
	effect1(rs,lz2[id]);
	lz2[id]=inf;
}
void pd(int id){
	if(lp[id]==rp[id])return;
	effect(ls,lz[id]);
	effect(rs,lz[id]);
	lz[id]=0;
}
void apd(int x){
	if(lp[x]==rp[x])return;
	if(lz[x])pd(x);
	if(lz1[x]!=-inf)pd1(x);
	if(lz2[x]!=inf)pd2(x);
}
void build(int id,int l,int r){
	lp[id]=l;
	rp[id]=r;
	lz1[id]=-(lz2[id]=inf);
	lz[id]=0;
	if(l==r){
		v11[id]=-(v21[id]=inf);
		s[id]=v1[id]=v2[id]=read();
		c1[id]=c2[id]=1;
		return; 
	} 
	build(ls,l,l+r>>1);
	build(rs,(l+r>>1)+1,r);
	pu(id);
}
ll query(int id,ll l,ll r){
	if(lp[id]>r||rp[id]<l) return 0ll;
	if(l<=lp[id]&&rp[id]<=r) return s[id];
	apd(id);
	return (query(ls,l,r)+query(rs,l,r));
}
ll query1(int id,ll l,ll r){
	if(lp[id]>r||rp[id]<l) return -inf;
	if(l<=lp[id]&&rp[id]<=r) return v1[id];
	apd(id);
	return max(query1(ls,l,r),query1(rs,l,r));
}
ll query2(int id,ll l,ll r){
	if(lp[id]>r||rp[id]<l) return inf;
	if(l<=lp[id]&&rp[id]<=r) return v2[id];
	apd(id);
	return min(query2(ls,l,r),query2(rs,l,r));
}
void modify(int id,int l,int r,int k){
	if(lp[id]>r||rp[id]<l) return;
	if(l<=lp[id]&&rp[id]<=r){
		effect(id,k);
		return;
	}
	apd(id);
	modify(ls,l,r,k);
	modify(rs,l,r,k);
	pu(id);
}
void modify1(int id,int l,int r,int k){
	if(lp[id]>r||rp[id]<l||k<=v2[id]) return;
	if(l<=lp[id]&&rp[id]<=r&&k<v21[id]){
		effect1(id,k);
		return;
	}
	apd(id);
	modify1(ls,l,r,k);
	modify1(rs,l,r,k);
	pu(id);
}
void modify2(int id,int l,int r,int k){
	if(lp[id]>r||rp[id]<l||k>=v1[id]) return;
	if(l<=lp[id]&&rp[id]<=r&&k>v11[id]){
		effect2(id,k);
		return;
	}
	apd(id);
	modify2(ls,l,r,k);
	modify2(rs,l,r,k);
	pu(id);
}
signed main(){
	build(1,1,n);
	m=read();
//	tf(3) printf("%lld~%lld:%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",lp[i]\
//,rp[i],s[i],v1[i],c1[i],v11[i],v2[i],c2[i],v21[i],lz[i],lz1[i],lz2[i]);
	while(m--){
		int op=read();
		if(op==1){
			int l=read(),r=read(),k=read();
			modify(1,l,r,k);
		}
		if(op==4){
			int l=read(),r=read();
			write(query(1,l,r)),putchar(10);
		}
		if(op==2){
			int l=read(),r=read(),k=read();
			modify1(1,l,r,k);
		}
		if(op==5){
			int l=read(),r=read();
			write(query1(1,l,r)),putchar(10);
		}
		if(op==3){
			int l=read(),r=read(),k=read();
			modify2(1,l,r,k);
		}
		if(op==6){
			int l=read(),r=read();
			write(query2(1,l,r)),putchar(10);
		}
//		tf(9) printf("%lld~%lld:%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",lp[i]\
//,rp[i],s[i],v1[i],c1[i],v11[i],v2[i],c2[i],v21[i],lz[i],lz1[i],lz2[i]);
	}
}

题目:最假女选手

  • lprp:存储线段树节点表示的区间的左端点和右端点。
  • s:存储当前节点区间的总和。
  • v1v2:存储当前节点区间的最大值和最小值。
  • v11v21:存储当前节点区间的严格次大值和严格次小值。
  • c1c2:记录最大值和最小值的出现次数。
  • lzlz1lz2:用于懒惰更新的标记。 玄 2 关。
2024/9/24 10:30
加载中...