3 条题解

  • 1
    @ 2023-9-5 20:25:56

    问题一 别忘了建树运行build,不写会出现val = 21934920813的问题 问题二 合并查找函数把三种情况写全 问题三 输进来俩数注意顺序

    #include <bits/stdc++.h>
    using namespace std;
    int n,m;
    struct P{
    	int maxl,max,maxr,sum;
    };
    P a[2000005];
    int c[500005];
    void cut(P t)
    {
        cout << t.max << " " << t.maxl << " " << t.maxr << endl;
    } 
    P pushup(P A,P B)
    {
    	P x;
    	x.sum = A.sum + B.sum;
    	x.maxl = max(A.maxl , A.sum + B.maxl);
    	x.maxr = max(B.maxr , B.sum + A.maxr);
    	x.max = max(max(A.max,B.max),A.maxr + B.maxl);
    	return x; 
    } 
    void build(int k,int l,int r)
    {
    	if(l == r)
    	{
    		a[k].sum = a[k].maxl = a[k].max = a[k].maxr = c[l];
    		return;
    	}
    	int mid = (l+r) / 2;
    	build(k*2,l,mid);
    	build(k*2+1,mid+1,r);
    	a[k] = pushup(a[k*2],a[k*2+1]);
    }
    void change(int k,int l,int r,int s,int t)
    {
    	if(l == r)
    	{
    		a[k].sum = a[k].maxl = a[k].max = a[k].maxr = t;
    		return;
    	}
    	int mid = (r+l)/2;
    	if(mid >= s) change(k*2,l,mid,s,t);
    	else change(k*2+1,mid+1,r,s,t);
    	a[k] = pushup(a[k*2],a[k*2+1]);
    } 
    P find(int k,int l,int r,int s,int t)
    {
    	P ans1,ans2;
    	if(s <= l && r <= t)
    	{
    		return a[k];
    	}
    	int mid = (l+r) / 2;
    	if( s <= mid && mid < t)
    		return pushup(find(k*2,l,mid,s,t),find(k*2+1,mid+1,r,s,t)); 
    	else if(s <= mid)
    		return find(k*2,l,mid,s,t); 
    	else
    		return find(k*2+1,mid+1,r,s,t);
    }
    int main()
    {
    	cin >> n >> m;
    	for(int i=1; i <= n ;i++)
    	{
    		cin >> c[i];
    	}
    	build(1,1,n);
    	for(int i=1; i <= m; i++)
    	{
    		int op,x,y;
    		cin >> op;
    		if(op == 1)
    		{
    			cin >> x >> y;
    			P ans = find(1,1,n,min(x,y),max(x,y)); 
    			cout << ans.max << endl;
    		}
    		else
    		{
    			cin >> x >> y;
    			change(1,1,n,x,y);
    		}
    	}
    	return 0;
    }
    
    • 0
      @ 2023-6-6 21:48:17

      根据线段树是前序遍历的性质,写了个不用结构体但总复杂度为 O(nlogn+mlog2n)O(n\log{n} + m\log^2{n}) 的劣解。

      #include <bits/stdc++.h>
      #define lson l,mid,rt<<1
      #define rson mid+1,r,rt<<1|1
      #define int long long
      using namespace std;
      const int MAXN = 5e5 + 5;
      int tr[MAXN<<2][4], a[MAXN], p;
      //和,前缀,后缀,子段 0-3
      int seg[MAXN];
      int n, m;
      void modfiy(int rt, int x)
      {
      	tr[rt][0] = tr[rt][1] = tr[rt][2] = tr[rt][3] = x;
      }
      void push_up(int rt)
      {
      	tr[rt][0] = tr[rt<<1][0] + tr[rt<<1|1][0];
      	tr[rt][1] = max(tr[rt<<1][1], tr[rt<<1][0] + tr[rt<<1|1][1]);
      	tr[rt][2] = max(tr[rt<<1|1][2], tr[rt<<1|1][0] + tr[rt<<1][2]);
      	tr[rt][3] = max({tr[rt<<1][3], tr[rt<<1|1][3], tr[rt<<1][2] + tr[rt<<1|1][1]});
      }
      void query(int L, int R, int l, int r, int rt)
      {
      	if (L <= l && r <= R)
      	{
      		seg[++p] = rt;
      		return;
      	}
      	int mid = (l + r) / 2;
      	if (mid >= L) query(L, R, lson);
      	if (mid < R) query(L, R, rson);
      }
      signed main()
      {
      	ios::sync_with_stdio(false);
      	cin.tie(0);
      	cin >> n >> m;
      	for (int i = 1; i <= n; i++)
      	{
      		cin >> a[i];
      	}
      	build(1, n, 1);
      	for (int i = 1; i <= m; i++)
      	{
      		int k, l, r;
      		cin >> k >> l >> r;
      		if (k == 1)
      		{
      			p = 0;
      			query(min(l, r), max(l, r), 1, n , 1);
      			int ans = -(1<<30), s = 0;
      			for (int i = 1; i <= p; i++)
      			{
      				ans = max(ans, tr[seg[i]][3]); s = 0;
      				for (int j = i+1; j <= p; j++)
      				{
      					ans = max(ans, tr[seg[i]][2] + s + tr[seg[j]][1]);
      					s += tr[seg[j]][0];
      				}
      			}
      			cout << ans << '\n';
      		}
      		else update(l, r, 1, n, 1);
      	}
      	return 0;
      }
      
      • 0
        @ 2023-5-31 21:19:35

        image

        #include<bits/stdc++.h>
        #define mid (l+r>>1)
        using namespace std;
        #define N 500001
        struct Node{int maxv,maxl,maxr,sumv;}a[N<<2];
        Node pushup(Node A,Node B)
        {
        	Node p;
        	p.maxv=max(A.maxv,B.maxv);
        	p.maxv=max(p.maxv,A.maxr+B.maxl);
        	p.maxl=max(A.maxl,A.sumv+B.maxl);
        	p.maxr=max(B.maxr,B.sumv+A.maxr);
        	p.sumv=A.sumv+B.sumv;
        	return p;
        }
        void build(int p,int l,int r)
        {
        	if(l==r)
        	{
        	  	scanf("%d",&a[p].maxv);
        	  	a[p].sumv=a[p].maxl=a[p].maxr=a[p].maxv;
        	  	return;
        	}
        	build(p<<1,l,mid);
        	build(p<<1|1,mid+1,r);
        	a[p]=pushup(a[p<<1],a[p<<1|1]);
        }
        void update(int p,int l,int r,int s,int t)//把s改成t 
        {
        	if(l==r)
        	{
        	  	a[p].sumv=a[p].maxl=a[p].maxr=a[p].maxv=t;
        	  	return;
        	}
        	if(s<=mid) update(p<<1,l,mid,s,t);
        	else update(p<<1|1,mid+1,r,s,t);
        	a[p]=pushup(a[p<<1],a[p<<1|1]);
        }
        Node query(int p,int l,int r,int s,int t)
        {
        	if(l>=s&&r<=t) return a[p];
        	if(s<=mid && t>mid)
        	  {
        	  	Node res;
        	  	res=pushup(query(p<<1,l,mid,s,t),query(p<<1|1,mid+1,r,s,t));
        	  	return res;
        	  }
        	else if(s<=mid) return query(p<<1,l,mid,s,t);
        	else return query(p<<1|1,mid+1,r,s,t);
        }
        int n,m;
        int main()
        {
        	freopen("in.txt","r",stdin);
        	int op,x,y;
        	scanf("%d%d",&n,&m);
        	build(1,1,n);
        	for(int i=1;i<=m;++i){
        	  	scanf("%d%d%d",&op,&x,&y);
        	  	if(op==1){
        		  	if(x>y) swap(x,y);
        		  	printf("%d\n",query(1,1,n,x,y).maxv);
        		}
        	  	else update(1,1,n,x,y);
        	}
        	return 0;
        }
        
        • 1

        信息

        ID
        119
        时间
        1000ms
        内存
        128MiB
        难度
        6
        标签
        递交数
        152
        已通过
        50
        上传者