bzoj 4094(线段树)

来源:互联网 发布:钢结构强度校核软件 编辑:程序博客网 时间:2024/06/07 15:26

传送门
题解:用线段树维护区间四个信息(左端点选/不选且右端点选/不选的区间最大不连续和),再记录四个信息中的最大值,然后每次修改都pushup到根并输出根的最大值即可。

#include<bits/stdc++.h>using namespace std;#define root 1,1,n#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rtypedef long long ll;const int MAXN=4e4+4;int n,m,a[MAXN];struct SegTree {    ll t[2][2];    ll mx;    SegTree() {t[0][0]=t[1][1]=t[0][1]=t[1][0]=mx=0;}}node[MAXN<<2];inline void pushup(int rt) {    node[rt].t[1][1]=max(node[rt<<1].t[1][0]+node[rt<<1|1].t[1][1],node[rt<<1].t[1][1]+node[rt<<1|1].t[0][1]);    node[rt].t[0][1]=max(node[rt<<1].t[0][1]+node[rt<<1|1].t[0][1],node[rt<<1].t[0][0]+node[rt<<1|1].t[1][1]);    node[rt].t[1][0]=max(node[rt<<1].t[1][1]+node[rt<<1|1].t[0][0],node[rt<<1].t[1][0]+node[rt<<1|1].t[1][0]);    node[rt].t[0][0]=max(node[rt<<1].t[0][0]+node[rt<<1|1].t[1][0],node[rt<<1].t[0][1]+node[rt<<1|1].t[0][0]);    node[rt].mx=max(max(node[rt].t[0][0],node[rt].t[1][1]),max(node[rt].t[1][0],node[rt].t[0][1]));}void build(int rt,int l,int r) {    if (l==r) {node[rt].mx=node[rt].t[1][1]=a[l];return ;}    int mid=l+r>>1;    build(lson);    build(rson);    pushup(rt);}void modify(int rt,int l,int r,int pos,int val) {    if (l==r) {node[rt].mx=node[rt].t[1][1]=val;return ;}    int mid=l+r>>1;    if (pos<=mid) modify(lson,pos,val);    else modify(rson,pos,val);    pushup(rt);}inline int read() {    int x=0;char c=getchar();    while (c<'0'||c>'9') c=getchar();    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x;}ll ret=0;int main() {//  freopen("bzoj 4094.in","r",stdin);    n=read(),m=read();    for (register int i=1;i<=n;++i) a[i]=read();    build(root);    for (register int CR7=0;CR7<m;++CR7) {        int pos=read(),val=read();        modify(root,pos,val);        ret+=node[1].mx;    }    printf("%lld\n",ret);    return 0;}
原创粉丝点击