标签:read etc typedef inf love cpp getch freopen const
https://www.lydsy.com/JudgeOnline/problem.php?id=4695
新博客用来整理,所以乱七八糟的东西我就暂时继续往这边扔了。
闲得淡疼打了个segtreebeats
我数据结构真是太弱了。。。
//Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++) #define Rep(i,a,b) for(int i=(a);i>=(b);i--) #define Formylove return 0 const int N=5e5+7; typedef long long LL; typedef double db; using namespace std; int o,n,m,a[N]; template<typename T> void read(T &x) { char ch=getchar(); x=0; T f=1; while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar(); if(ch==‘-‘) f=-1,ch=getchar(); for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; x*=f; } #define inf 1e9 struct data { int mi,smi,cmi,mx,smx,cmx,cnt,lz; LL sum; }dt[N<<2]; data operator +(const data&A,const data&B) { data rs; rs.lz=0; if(A.mi<B.mi) { rs.mi=A.mi; rs.cmi=A.cmi; rs.smi=min(A.smi,B.mi); } else if(B.mi<A.mi) { rs.mi=B.mi; rs.cmi=B.cmi; rs.smi=min(B.smi,A.mi); } else { rs.mi=A.mi; rs.cmi=A.cmi+B.cmi; rs.smi=min(A.smi,B.smi); } rs.cnt=A.cnt+B.cnt; rs.sum=A.sum+B.sum; if(A.mx>B.mx) { rs.mx=A.mx; rs.cmx=A.cmx; rs.smx=max(A.smx,B.mx); } else if(B.mx>A.mx) { rs.mx=B.mx; rs.cmx=B.cmx; rs.smx=max(B.smx,A.mx); } else { rs.mx=A.mx; rs.cmx=A.cmx+B.cmx; rs.smx=max(A.smx,B.smx); } return rs; } #define lc x<<1 #define rc ((x<<1)|1) #define mid ((l+r)>>1) void build(int x,int l,int r) { if(l==r) { dt[x]=(data){a[l],inf,1,a[l],-inf,1,1,0,a[l]}; return; } build(lc,l,mid); build(rc,mid+1,r); dt[x]=dt[lc]+dt[rc]; } void add(int x,int v) { dt[x].sum+=(LL)dt[x].cnt*v; dt[x].lz+=v; dt[x].mi+=v; dt[x].mx+=v; if(dt[x].smi!=inf) dt[x].smi+=v; if(dt[x].smx!=-inf) dt[x].smx+=v; } void get_min(int x,int v) { if(dt[x].mx<=v) return; dt[x].sum-=(LL)dt[x].cmx*(dt[x].mx-v); if(dt[x].mi==dt[x].mx) dt[x].mi=v; if(dt[x].smi==dt[x].mx) dt[x].smi=v; dt[x].mx=v; } void get_max(int x,int v) { if(dt[x].mi>=v) return; dt[x].sum+=(LL)dt[x].cmi*(v-dt[x].mi); if(dt[x].mi==dt[x].mx) dt[x].mx=v; if(dt[x].smx==dt[x].mi) dt[x].smx=v; dt[x].mi=v; } void down(int x,int l,int r) { if(dt[x].lz) add(lc,dt[x].lz),add(rc,dt[x].lz); dt[x].lz=0; get_min(lc,dt[x].mx); get_max(lc,dt[x].mi); get_min(rc,dt[x].mx); get_max(rc,dt[x].mi); } void change(int x,int l,int r,int ql,int qr,int v) { if(l>=ql&&r<=qr) { if(o==1) { add(x,v); return; } else if(o==2) { if(dt[x].mi>=v) return; else if(dt[x].smi>v) { get_max(x,v); return; } } else { if(dt[x].mx<=v) return; else if(dt[x].smx<v) { get_min(x,v); return; } } } down(x,l,r); if(ql<=mid) change(lc,l,mid,ql,qr,v); if(qr>mid) change(rc,mid+1,r,ql,qr,v); dt[x]=dt[lc]+dt[rc]; } LL Qrs; void qry(int x,int l,int r,int ql,int qr) { if(l>=ql&&r<=qr) { if(o==4) Qrs+=dt[x].sum; else if(o==5) Qrs=max(Qrs,(LL)dt[x].mx); else Qrs=min(Qrs,(LL)dt[x].mi); return ; } down(x,l,r); if(ql<=mid) qry(lc,l,mid,ql,qr); if(qr>mid) qry(rc,mid+1,r,ql,qr); } int main() { //freopen("4695.in","r",stdin); //freopen("4695.out","w",stdout); read(n); For(i,1,n) read(a[i]); build(1,1,n); read(m); For(i,1,m) { read(o); int l,r,v; read(l); read(r); if(o<=3) { read(v); change(1,1,n,l,r,v); } else { Qrs=(o==4?0:(o==5?-inf:inf)); qry(1,1,n,l,r); printf("%lld\n",Qrs); } } Formylove; }
标签:read etc typedef inf love cpp getch freopen const
原文地址:https://www.cnblogs.com/Achenchen/p/10408612.html