zoukankan      html  css  js  c++  java
  • bzoj4695: 最假女选手

    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
    ",Qrs);
        	}
        }
        Formylove;
    }
    
    //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=5005;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int a[N][N];
    
    template<typename T> void read(T &x) {
    	char ch=getchar(); T f=1; x=0;
    	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;
    }
    
    int main() {
    	//freopen("1.in","w",stdout);
        srand(time(0));
        int n=rand()%10+1,m=rand()%10+1;
        printf("%d
    ",n);
        For(i,1,n) {
        	int x=rand()%10+1;
        	printf("%d ",x);
        } puts("");
        printf("%d
    ",m);
        For(i,1,m) {
    		int o,l,r,v;
    		l=rand()%n+1;
    		r=rand()%n+1;
    		if(l>r) swap(l,r);
    		o=rand()%6+1;
    		v=rand()%10+1;
    		if(o<=3) printf("%d %d %d %d
    ",o,l,r,v);
    		else printf("%d %d %d
    ",o,l,r);
    	}
        Formylove;
    }
    
  • 相关阅读:
    使用element-ui是下拉筛选选择
    vue 组件传值
    vue element 地址联动的使用
    vux scroller
    实时监听组件中路由的变化
    vuex的使用
    对移动端滚动高度的获取
    【转】ACM 取石子问题
    【转】ACM博弈知识汇总
    EOJ 2857 编辑距离
  • 原文地址:https://www.cnblogs.com/Achenchen/p/10408612.html
Copyright © 2011-2022 走看看