码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4695: 最假女选手

时间:2019-02-20 19:53:05      阅读:171      评论:0      收藏:0      [点我收藏+]

标签: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;
}

 

bzoj4695: 最假女选手

标签:read   etc   typedef   inf   love   cpp   getch   freopen   const   

原文地址:https://www.cnblogs.com/Achenchen/p/10408612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!