3 条题解
-
1
问题一 别忘了建树运行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
根据线段树是前序遍历的性质,写了个不用结构体但总复杂度为 的劣解。
#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
#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
- 上传者