• poj 2750 Potted Flower


    http://poj.org/problem?id=2750

    这道题给出的是个环,如果是一个序列,用线段树很容易做出来,给的是个环就要考虑断点是不是在最大连续和之内。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 2000000
     5 using namespace std;
     6 
     7 int n,m,x,y;
     8 int a[maxn];
     9 struct node
    10 {
    11     int l,r;
    12     int lmax,rmax,summax;
    13     int lmin,rmin,summin;
    14     int sum;
    15 }tree[maxn*4];
    16 
    17 
    18 void up(int i)
    19 {
    20     tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
    21     tree[i].lmax=max(tree[i<<1].lmax,tree[i<<1].sum+tree[i<<1|1].lmax);
    22     tree[i].rmax=max(tree[i<<1|1].rmax,tree[i<<1|1].sum+tree[i<<1].rmax);
    23     tree[i].summax=max(max(tree[i<<1].summax,tree[i<<1|1].summax),tree[i<<1].rmax+tree[i<<1|1].lmax);
    24 
    25     tree[i].lmin=min(tree[i<<1].lmin,tree[i<<1].sum+tree[i<<1|1].lmin);
    26     tree[i].rmin=min(tree[i<<1|1].rmin,tree[i<<1|1].sum+tree[i<<1].rmin);
    27     tree[i].summin=min(min(tree[i<<1].summin,tree[i<<1|1].summin),tree[i<<1].rmin+tree[i<<1|1].lmin);
    28 }
    29 void build(int i,int l,int r)
    30 {
    31     tree[i].l=l;
    32     tree[i].r=r;
    33     if(l==r)
    34     {
    35         tree[i].sum=a[l];
    36         tree[i].lmax=tree[i].rmax=tree[i].summax=a[l];
    37         tree[i].lmin=tree[i].rmin=tree[i].summin=a[l];
    38         return ;
    39     }
    40     int mid=(l+r)>>1;
    41     build(i<<1,l,mid);
    42     build(i<<1|1,mid+1,r);
    43     up(i);
    44 }
    45 
    46 void search1(int i,int l,int r,int key)
    47 {
    48     if(tree[i].l==l&&tree[i].r==r)
    49     {
    50          tree[i].sum=key;
    51          tree[i].lmax=tree[i].rmax=tree[i].summax=key;
    52          tree[i].lmin=tree[i].rmin=tree[i].summin=key;
    53          return ;
    54     }
    55     int mid=(tree[i].l+tree[i].r)>>1;
    56     if(r<=mid)
    57     {
    58         search1(i<<1,l,r,key);
    59     }
    60     else
    61       search1(i<<1|1,l,r,key);
    62     up(i);
    63 }
    64 
    65 
    66 int main()
    67 {
    68    while(scanf("%d",&n)!=EOF)
    69    {
    70        for(int i=1; i<=n; i++)
    71        {
    72            scanf("%d",&a[i]);
    73        }
    74        scanf("%d",&m);
    75        build(1,1,n);
    76        for(int i=0; i<m; i++)
    77        {
    78            scanf("%d%d",&x,&y);
    79            search1(1,x,x,y);
    80            if(tree[1].sum==tree[1].summax)
    81            {
    82                printf("%d
    ",tree[1].sum-tree[1].summin);
    83            }
    84            else
    85            printf("%d
    ",max(tree[1].summax,tree[1].sum-tree[1].summin));
    86        }
    87    }
    88    return 0;
    89 }
    View Code
  • 相关阅读:
    express前后端分离session的使用
    wampserver2.5局域网IP访问配置
    wamp的HTTPS配置
    wampserver2.5局域网公网IP访问配置
    WampServer的安装
    Node.js的安装与使用-Windows系统
    外网连接Mysql云数据库
    ajax连接服务器框架
    servlet连接mysql数据库和oracle数据库
    c++的第一个程序-Helloworld
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3780575.html
Copyright © 2020-2023  润新知