线段树求调。。。
查看原帖
线段树求调。。。
570574
int_jab楼主2022/10/4 09:17

样例都过不了。。。

#include<bits/stdc++.h>
using namespace std;
const int inf = 2e9;
struct node 
{
    long long l,r;
    long long ans,maxl,minl,maxr,minr,sum;
}t[800010];
int a[200010];
inline long long max3(long long a,long long b,long long c){return max(max(a,b),c);}
inline long long min3(long long a,long long b,long long c){return min(min(a,b),c);}
inline long long max4(long long a,long long b,long long c,long long d){return max(max(a,b),max(c,d));}
inline long long min4(long long a,long long b,long long c,long long d){return min(min(a,b),min(c,d));}
inline void check(long long &x) {
    if(x > inf) x = inf;
    if(x < -inf) x = -inf;
}
inline void pushup(node T,node T1,node T2) 
{
	T.maxl = max3(T1.maxl, T1.sum * T2.maxl, T1.sum * T2.minl); check(T.maxl);
    T.maxr = max3(T2.maxr, T2.sum * T1.maxr, T2.sum * T1.minr); check(T.maxr);
    T.minl = min3(T1.minl, T1.sum * T2.maxl, T1.sum * T2.minl); check(T.minl);
    T.minr = min3(T2.minr, T2.sum * T1.maxr, T2.sum * T1.minr); check(T.minr);
    T.sum = T1.sum * T2.sum; check(T.sum);
    T.ans = max4(T1.ans, T2.ans, T1.maxr * T2.maxl, T1.minr * T2.minl); check(T.ans);
}
void build(int c,int l,int r) 
{
    t[c].l = l; t[c].r = r;
   	if(l == r) 
	{
        t[c].maxl = t[c].maxr = max(1,a[l]);
        t[c].minl = t[c].minr = min(1,a[l]);
        t[c].ans = max(1,a[l]);
        t[c].sum = a[l];
        return ;
    }
    int mid = (l + r) / 2;
    build(c*2,l,mid);
    build(c*2+1,mid+1,r);
    pushup(t[c],t[c*2],t[c*2+1]);
}
void update(int c,int x,int v) 
{
    if(t[c].l == t[c].r) 
	{
        t[c].maxl = t[c].maxr = max(1,v);
        t[c].minl = t[c].minr = min(1,v);
        t[c].ans = max(1,v);
    	t[c].sum = v;
        return ;
    }
    int mid = (t[c].l + t[c].r) / 2;
    if(x <= mid) update(c*2,x,v);
    if(x > mid) update(c*2+1,x,v);
    pushup(t[c],t[c*2],t[c*2+1]);
}
node query(int c, int x, int y) 
{
    node T;
	if(t[c].l >= x && t[c].r <= y) return t[c];
    int mid = (t[c].l + t[c].r) / 2;
    if(y <= mid) return query(c*2, x, y);
    if(mid < x) return query(c*2 + 1, x, y);
	pushup(T,query(c*2,x,y),query(c*2+1,x,y));
    return T;
}
int main() {
    int n, q;
    cin >> n >> q;
    for(int i = 1;i <= n;i++) cin >> a[i];
    build(1,1,n);
    while(q--)
	{
        int opt, x, y;
        cin >> opt >> x >> y;
        if(opt == 1) update(1,x,y);
        if(opt == 2)
        {
            node T = query(1,x,y);
            if(T.ans > (1 << 30)) cout << "Too large" << endl;
            else cout << T.ans << endl;
        }
	}
    return 0;
}
2022/10/4 09:17
加载中...