hdu 5316 Magician 线段树

2015 Multi-University Training Contest 3  1001

  1 #include "bits/stdc++.h"
  2 using namespace std;
  3 #define M 100010
  4 #define lson l,m,rt<<1
  5 #define rson m+1,r,rt<<1|1
  6 
  7 int T, n, m;
  8 int ans[M];
  9 struct Node
 10 {
 11     int l, r;
 12     long long sum11, sum12, sum21, sum22;
 13 }node[M<<2], query_node;
 14 const long long INF = 100000000000000 + 1;
 15 
 16 bool First;
 17 
 18 inline void PushPlus(int rt)
 19 {
 20     node[rt].sum11 = max(node[rt<<1].sum11 + node[rt<<1|1].sum21, node[rt<<1].sum12 + node[rt<<1|1].sum11);
 21     node[rt].sum12 = max(node[rt<<1].sum11 + node[rt<<1|1].sum22, node[rt<<1].sum12 + node[rt<<1|1].sum12);
 22     node[rt].sum21 = max(node[rt<<1].sum21 + node[rt<<1|1].sum21, node[rt<<1].sum22 + node[rt<<1|1].sum11);
 23     node[rt].sum22 = max(node[rt<<1].sum21 + node[rt<<1|1].sum22, node[rt<<1].sum22 + node[rt<<1|1].sum12);
 24 
 25     node[rt].sum11 = max(node[rt].sum11, node[rt<<1|1].sum11);
 26     node[rt].sum12 = max(node[rt].sum12, node[rt<<1|1].sum12);
 27     node[rt].sum21 = max(node[rt].sum21, node[rt<<1|1].sum21);
 28     node[rt].sum22 = max(node[rt].sum22, node[rt<<1|1].sum22);
 29 
 30     node[rt].sum11 = max(node[rt].sum11, node[rt<<1].sum11);
 31     node[rt].sum12 = max(node[rt].sum12, node[rt<<1].sum12);
 32     node[rt].sum21 = max(node[rt].sum21, node[rt<<1].sum21);
 33     node[rt].sum22 = max(node[rt].sum22, node[rt<<1].sum22);
 34 }
 35 
 36 
 37 void Merge_Node(Node &newNode, Node lNode, Node rNode)
 38 {
 39     newNode.sum11 = max(lNode.sum11 + rNode.sum21, lNode.sum12 + rNode.sum11);
 40     newNode.sum12 = max(lNode.sum11 + rNode.sum22, lNode.sum12 + rNode.sum12);
 41     newNode.sum21 = max(lNode.sum21 + rNode.sum21, lNode.sum22 + rNode.sum11);
 42     newNode.sum22 = max(lNode.sum21 + rNode.sum22, lNode.sum22 + rNode.sum12);
 43 
 44     newNode.sum11 = max(newNode.sum11, rNode.sum11);
 45     newNode.sum12 = max(newNode.sum12, rNode.sum12);
 46     newNode.sum21 = max(newNode.sum21, rNode.sum21);
 47     newNode.sum22 = max(newNode.sum22, rNode.sum22);
 48 
 49     newNode.sum11 = max(newNode.sum11, lNode.sum11);
 50     newNode.sum12 = max(newNode.sum12, lNode.sum12);
 51     newNode.sum21 = max(newNode.sum21, lNode.sum21);
 52     newNode.sum22 = max(newNode.sum22, lNode.sum22);
 53 }
 54 
 55 void Build(int l, int r, int rt)
 56 {
 57     if(l == r) {
 58         scanf("%d", &ans[l]);
 59         node[rt].sum11 = node[rt].sum12 = node[rt].sum21 = node[rt].sum22 = -INF;
 60         if(l & 1) {
 61             node[rt].sum11 = ans[l];
 62         }
 63         else {
 64             node[rt].sum22 = ans[l];
 65         }
 66 //        printf("l == %d  r == %d  sum11 == %lld  sum12 == %lld  sum21 == %lld  sum22 == %lld\n", l, r, node[rt].sum11, node[rt].sum12, node[rt].sum21, node[rt].sum22);
 67         return ;
 68     }
 69     int m = ( l + r )>>1;
 70     Build(lson);
 71     Build(rson);
 72     PushPlus(rt);
 73 //    printf("l == %d  r == %d  sum11 == %lld  sum12 == %lld  sum21 == %lld  sum22 == %lld\n", l, r, node[rt].sum11, node[rt].sum12, node[rt].sum21, node[rt].sum22);
 74 }
 75 
 76 void Update(int p, int newVal, int l, int r, int rt)
 77 {
 78     if(l == r) {
 79         if(l & 1) {
 80             node[rt].sum11 = newVal;
 81         }
 82         else {
 83             node[rt].sum22 = newVal;
 84         }
 85         return ;
 86     }
 87     int m = (l + r) >> 1;
 88     if(p <= m)
 89         Update(p, newVal, lson);
 90     else
 91         Update(p, newVal, rson);
 92     PushPlus(rt);
 93 }
 94 
 95 void Query(int L,int R,int l,int r,int rt)
 96 {
 97     if(L <= l && r <= R) {
 98 //        if(First) {
 99 //            First = 0;
100 //            query_node = node[rt];
101 //        }
102 //        else {
103             Merge_Node(query_node, query_node, node[rt]);
104 //        }
105         return ;
106     }
107     int m = (l + r) >> 1;
108     if(L <= m)
109         Query(L, R, lson);
110     if(R > m)
111         Query(L, R, rson);
112 }
113 
114 
115 int main()
116 {
117     int i, cmd, L, R, POS, VAL;
118     scanf("%d", &T);
119     while(T--) {
120         scanf("%d%d", &n, &m);
121         Build(1, n, 1);
122         for(i = 1; i <= m; ++i) {
123             scanf("%d", &cmd);
124             if(cmd == 0) {
125                 scanf("%d%d", &L, &R);
126 //                First = 1;
127                 query_node.sum11 = query_node.sum12 = query_node.sum21 = query_node.sum22 = -INF;
128                 Query(L, R, 1, n, 1);
129                 printf("%lld\n", max( max(query_node.sum11, query_node.sum12), max(query_node.sum21, query_node.sum22) ));
130             }
131             else {
132                 scanf("%d%d", &POS, &VAL);
133                 Update(POS, VAL, 1, n, 1);
134             }
135         }
136     }
137 }

 

转载于:https://www.cnblogs.com/AC-Phoenix/p/4684232.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值