zoukankan      html  css  js  c++  java
  • GSS1

    Code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    using namespace std;
    const int N = 50100;
    typedef long long ll;
    ll sum[N << 2],pre_sum[N << 2],suf_sum[N << 2],sub_sum[N << 2],n,m;
    inline ll read()
    {
    	ll res = 0,flag = 1;
    	char ch = getchar();
    	while(ch < '0' || ch > '9')
    	{
    		if(ch == '-') flag = -1;
    		ch = getchar();
    	} 
    	while(ch <= '9' && ch >= '0')
    	{
    		res = res*10 + ch - '0';
    		ch = getchar();
    	}
    	return res*flag;
    }
    void update(int rt)
    {
    	sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    	pre_sum[rt] = max(pre_sum[rt<<1],sum[rt<<1] + pre_sum[rt<<1|1]);
    	suf_sum[rt] = max(suf_sum[rt<<1|1],suf_sum[rt<<1] + sum[rt<<1|1]);
    	sub_sum[rt] = max(suf_sum[rt<<1] + pre_sum[rt<<1|1],max(sub_sum[rt<<1],sub_sum[rt<<1|1]));
    }
    void build(int l,int r,int rt)
    {
    	if(l == r)
    	{
    		pre_sum[rt] = suf_sum[rt] = sub_sum[rt] = sum[rt] = read();
    		return;
    	}
    	int mid = (l+r)>>1;
    	build(lson);
    	build(rson);
    	update(rt);
    }
    ll query_pre(int l,int r,int rt,int ql,int qr)
    {
    	if(ql <= l && r <= qr) return pre_sum[rt];
    	int mid = (l+r)>>1;
    	if(qr <= mid) return query_pre(lson,ql,qr);
    	return max(query_pre(lson,ql,qr),sum[rt<<1] + query_pre(rson,ql,qr));
    }
    ll query_suf(int l,int r,int rt,int ql,int qr)
    {
    	if(ql <= l && r <= qr) return suf_sum[rt];
    	ll mid = (l+r)>>1;
    	if(mid < ql) return query_suf(rson,ql,qr);
    	return max(query_suf(rson,ql,qr),sum[rt<<1|1] + query_suf(lson,ql,qr));
    }
    ll query_sub(int l,int r,int rt,int ql,int qr)
    {
    	if(ql <= l && r <= qr) return sub_sum[rt];
    	ll res = -9999999;
    	ll mid = (l+r)>>1;
    	if(ql <= mid) res = max(res,query_sub(lson,ql,qr));//
    	if(mid < qr) res = max(res,query_sub(rson,ql,qr));//
    	if(ql <= mid && mid < qr) res = max(res,query_suf(lson,ql,qr) + query_pre(rson,ql,qr));
    	return res;
    }
    int main()
    {
    	n = read();
    	build(1,n,1);
    	m = read();
    	for(int i = 1;i <= m;++i)
    	{
    		ll l,r;
    		l = read();
    		r = read();
    		printf("%lld
    ",query_sub(1,n,1,l,r));
    	}
    	return 0;
    }
    
    
    岂能尽如人意,但求无愧我心
  • 相关阅读:
    简单数列极限证明
    既然已经半退役了,就写点新东西吧
    快速幂(整数+实数)
    D. Constant Palindrome Sum 差分+思维
    排序网络
    ClickHouse数据同步
    C++ 复习
    使用mac查看iphone uuid方法
    15. 蓝绿发布导致需求不能验证
    通过反射获取对象的属性名、属性值
  • 原文地址:https://www.cnblogs.com/Zforw/p/11373950.html
Copyright © 2011-2022 走看看