PKU 2750 Potted Flower 解题报告
来源:互联网 发布:apache ivy 编辑:程序博客网 时间:2024/05/22 00:18
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int MAX = 100000;
- struct Node{
- int sum;
- int maxSum, minSum;
- int maxl, maxr;
- int minl, minr;
- };
- int Num[MAX];
- Node M[1 << 18];
- inline int min(int a, int b){
- return a < b ? a : b;
- }
- inline int max(int a, int b){
- return a > b ? a : b;
- }
- void update_node(int parent, int left, int right){
- M[parent].sum = M[left].sum + M[right].sum;
- M[parent].maxSum = max(max(M[left].maxSum, M[right].maxSum),
- M[left].maxr + M[right].maxl);
- M[parent].minSum = min(min(M[left].minSum, M[right].minSum),
- M[left].minr + M[right].minl);
- M[parent].maxl = max(M[left].maxl, M[left].sum+M[right].maxl);
- M[parent].maxr = max(M[left].maxr+M[right].sum, M[right].maxr);
- M[parent].minl = min(M[left].minl, M[left].sum+M[right].minl);
- M[parent].minr = min(M[left].minr+M[right].sum, M[right].minr);
- }
- void init_tree(int node, int l, int r){
- if(l == r){
- M[node].sum = M[node].maxSum = M[node].minSum = Num[l];
- M[node].maxl = M[node].maxr = M[node].minl = M[node].minr = Num[l];
- }else{
- init_tree(node * 2, l, (l+r)/2);
- init_tree(node*2+1, (l+r)/2+1, r);
- update_node(node, node * 2, node * 2 + 1);
- }
-
- }
- void change_query(int node, int l, int r, int pos, int value){
-
- if(l == r){
- if(l == pos)
- M[node].sum = M[node].maxSum = M[node].minSum = value;
- M[node].maxl = M[node].maxr = M[node].minl = M[node].minr = value;
- }else{
- if(l <= pos && pos <= (l+r)/2)
- change_query(node * 2, l, (l+r)/2, pos, value);
- else
- change_query(node*2+1, (l+r)/2+1, r, pos, value);
- update_node(node, node*2, node*2+1);
- }
-
-
- }
- int main(){
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- int N;
- while(scanf("%d", &N) != EOF){
- for(int i = 0; i < N; i++)
- scanf("%d", &Num[i]);
- init_tree(1, 0, N-1);
- int K, A, B;
- scanf("%d", &K);
- for(int i = 0; i < K; i++){
- scanf("%d%d", &A, &B);
- change_query(1, 0, N-1, A-1, B);
-
- if(M[1].sum == M[1].maxSum)printf("%d/n", M[1].sum - M[1].minSum);
- else printf("%d/n", max(M[1].maxSum, M[1].sum - M[1].minSum));
- }
- }
- return 0;
- }