1 条题解

  • 0
    @ 2026-4-23 8:40:18

    #include <bits/stdc++.h>
    #define N 512202
    #define INF 0x2c9d526cd03581ell
    using namespace std;
    
    typedef long long ll;
    
    template <typename T>
    struct ST{
    	int sz;
    	struct node{int l, r; T v0, v1, m0, m1;}*x;
    	ST (int size = 100){x = 0; resize(size);}
    	~ST (){delete(x);}
    	void resize(int size){sz = size; if(x) delete(x); x = new node[sz << 2]; memset(x, 0, (sz << 2) * sizeof(T));}
    	void init(){build(1, 1, sz);}
    	void add(int l, int r, T v){add(1, 1, sz, l, r, v);}
    	void sub(int l, int r, T v){sub(1, 1, sz, l, r, v);}
    	T qry(int h, T v){int id = find(1, 1, sz, h); return max(v + x[id].v0, x[id].v1);}
    	T his(int h, T v){int id = find(1, 1, sz, h); return max(v + x[id].m0, x[id].m1);}
    //////////////////////////////////
    	inline void up(T &a, T b){a < b ? a = b : b;}
    	void build(int id, int L, int R){
    		x[id].v0 = x[id].v1 = x[id].m0 = x[id].m1 = 0;
    		if(L < R){
    			int M = L + R - 1 >> 1;
    			build(id << 1, L, M);
    			build(id << 1 | 1, M + 1, R);
    		}
    	}
    	void update(int id){
    		up(x[id].v0, -INF); up(x[id].v1, -INF);
    		up(x[id].m0, x[id].v0); up(x[id].m1, x[id].v1);
    	}
    	void push_down(int id, int Lc, int Rc){
    		up(x[Lc].m0, x[Lc].v0 + x[id].m0); up(x[Rc].m0, x[Rc].v0 + x[id].m0);
    		up(x[Lc].m1, max(x[id].m1, x[Lc].v1 + x[id].m0)); up(x[Rc].m1, max(x[id].m1, x[Rc].v1 + x[id].m0));
    		x[Lc].v0 += x[id].v0; x[Rc].v0 += x[id].v0;
    		x[Lc].v1 += x[id].v0; x[Rc].v1 += x[id].v0;
    		up(x[Lc].v1, x[id].v1); up(x[Rc].v1, x[id].v1);
    		x[id].v0 = x[id].v1 = x[id].m0 = x[id].m1 = 0;
    		update(Lc); update(Rc);
    	}
    	void add(int id, int L, int R, int ql, int qr, T v){
    		if(R < ql || qr < L) return;
    		if(ql <= L && R <= qr){x[id].v0 += v; x[id].v1 += v; update(id); return;}
    		int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1;
    		push_down(id, Lc, Rc);
    		if(ql <= M) add(Lc, L, M, ql, qr, v);
    		if(qr > M) add(Rc, M + 1, R, ql, qr, v);
    	}
    	void sub(int id, int L, int R, int ql, int qr, T v){
    		if(R < ql || qr < L) return;
    		if(ql <= L && R <= qr){x[id].v0 -= v; x[id].v1 -= v; up(x[id].v1, 0); update(id); return;}
    		int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1;
    		push_down(id, Lc, Rc);
    		if(ql <= M) sub(Lc, L, M, ql, qr, v);
    		if(qr > M) sub(Rc, M + 1, R, ql, qr, v);
    	}
    	int find(int id, int L, int R, int h){
    		if(L == R) return id;
    		int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1;
    		push_down(id, Lc, Rc);
    		if(h <= M) return find(Lc, L, M, h);
    		if(h > M) return find(Rc, M + 1, R, h);
    	}
    };
    
    int n, q, i;
    int a[N];
    int ch, l, r, h;
    ll x;
    ST <ll> s;
    
    int main(){
    	scanf("%d%d", &n, &q);
    	s.resize(n);
    	for(i = 1; i <= n; i++)
    		scanf("%d", a + i);
    	s.init();
    	for(; q; q--){
    		switch(scanf("%d", &ch), ch){
    			case 1:
    				scanf("%d%d%lld", &l, &r, &x);
    				s.add(l, r, x);
    				break;
    			case 2:
    				scanf("%d%d%lld", &l, &r, &x);
    				s.sub(l, r, x);
    				break;
    			case 3:
    				scanf("%d%d%lld", &l, &r, &x);
    				s.sub(l, r, INF);
    				s.add(l, r, x);
    				break;
    			case 4:
    				scanf("%d", &h);
    				printf("%lld\n", s.qry(h, (ll)a[h]));
    				break;
    			case 5:
    				scanf("%d", &h);
    				printf("%lld\n", s.his(h, (ll)a[h]));
    				break;
    		}
    	}
    	return 0;
    }
    
    
    
    • 1

    【清华集训2015】V(数据不全)

    信息

    ID
    579
    时间
    2000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    240
    已通过
    66
    上传者