• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 100,  comments - 15,  trackbacks - 0
            //參考:
            http://hi.baidu.com/fandywang_jlu/blog/item/505b40f4c864bddff3d38574.html
            http://blog.csdn.net/ldyhot/archive/2008/10/29/3173535.aspx

              1/*
              2線段樹(shù)+DP 
              3        出題者的簡(jiǎn)單解題報(bào)告:把環(huán)從一個(gè)地方,切斷拉成一條直線,
              4        用線段樹(shù)記錄當(dāng)前區(qū)間的非空最大子列和當(dāng)前區(qū)間的非空最小
              5        子列。如果環(huán)上的數(shù)都是正整數(shù),答案是:環(huán)上數(shù)的總和-根
              6        結(jié)點(diǎn)的非空最小子列;否則,答案是:max{根結(jié)點(diǎn)的非空最大
              7        子列, 環(huán)上數(shù)的總和-根結(jié)點(diǎn)的非空最小子列},每次問(wèn)答的
              8        復(fù)雜度是O(logN)。
              9*/

             10
             11#include<iostream>
             12using namespace std;
             13#define MAXN 100000
             14#define MAXM 100000
             15#define MAX 262145
             16
             17struct Node
             18{
             19    int left;
             20    int right;
             21    int sum;        //該區(qū)間 數(shù)的總和 
             22    int max,min;    //該區(qū)間 最大子列和 與 最小子列和
             23    int lmax,rmax;    //該區(qū)間 從左端點(diǎn)開(kāi)始的最大子列和 與 到右端點(diǎn)結(jié)束的最小子列和
             24    int lmin,rmin;    //該區(qū)間 從左端點(diǎn)開(kāi)始的最小子列和 與 到右端點(diǎn)結(jié)束的最小子列和
             25}
            ;
             26
             27Node segtree[MAX];
             28int value[MAXN+1];
             29//int vi;
             30
             31void update (int v)
             32{
             33    segtree[v].sum=segtree[2*v].sum+segtree[2*v+1].sum;
             34    segtree[v].max=max(max(segtree[2*v].max,segtree[2*v+1].max),segtree[2*v].rmax+segtree[2*v+1].lmax);
             35    segtree[v].min=min(min(segtree[2*v].min,segtree[2*v+1].min),segtree[2*v].rmin+segtree[2*v+1].lmin);
             36    segtree[v].lmax=max(segtree[2*v].lmax, segtree[2*v].sum+segtree[2*v+1].lmax);
             37    segtree[v].rmax=max(segtree[2*v+1].rmax, segtree[2*v+1].sum+segtree[2*v].rmax);
             38    segtree[v].lmin=min(segtree[2*v].lmin,segtree[2*v].sum+segtree[2*v+1].lmin);
             39    segtree[v].rmin=min(segtree[2*v+1].rmin,segtree[2*v+1].sum+segtree[2*v].rmin);
             40}

             41
             42void build(int v,int l,int r)
             43{
             44    segtree[v].left=l;
             45    segtree[v].right=r;
             46
             47    if(l == r )
             48    {
             49        segtree[v].sum =
             50        segtree[v].max = segtree[v].min =
             51        segtree[v].lmax = segtree[v].rmax =
             52        segtree[v].lmin = segtree[v].rmin =value[l];
             53        
             54    }
            else
             55    {
             56        
             57        int mid=(segtree[v].left+segtree[v].right)>>1;
             58        build(2*v,l,mid);
             59        build(2*v+1,mid+1,r);
             60        update(v);
             61    }

             62    
             63}

             64
             65void insert(int v,int index)
             66{
             67    if( segtree[v].left == segtree[v].right && segtree[v].left == index)
             68    {
             69        segtree[v].sum =
             70        segtree[v].max = segtree[v].min =
             71        segtree[v].lmax = segtree[v].rmax =
             72        segtree[v].lmin = segtree[v].rmin =value[index];
             73    }
            else
             74    {
             75        int mid=(segtree[v].left+segtree[v].right)>>1;
             76        if(index <= mid) insert(2*v,index);
             77        else insert(2*v+1,index);
             78        //if(index <= segtree[2*v].right) insert(2*v,index);
             79        //else if(index >= segtree[2*v+1].left) insert(2*v+1,index);
             80        update(v);
             81    }

             82}

             83
             84int main()
             85{
             86    int n,k,i,index;
             87    scanf("%d",&n);
             88    for(i=1;i<=n;i++)
             89        scanf("%d",&value[i]);
             90
             91    build(1,1,n);
             92
             93    scanf("%d",&k);
             94    while(k--)
             95    {
             96        scanf("%d",&index);
             97        scanf("%d",&value[index]);
             98        insert(1,index);
             99        if(segtree[1].sum==segtree[1].max)
            100            printf("%d\n",segtree[1].sum-segtree[1].min);
            101        else printf("%d\n",max(segtree[1].max,segtree[1].sum-segtree[1].min));
            102    }

            103    return 0;
            104}

            105
            posted on 2009-04-18 22:41 wyiu 閱讀(256) 評(píng)論(0)  編輯 收藏 引用 所屬分類: POJ
            国产精品视频久久| 一级女性全黄久久生活片免费| 欧美午夜精品久久久久免费视 | 久久久久无码国产精品不卡| 国内精品久久久久影院亚洲| 久久久久久毛片免费播放| 国内精品久久久久久麻豆| 狠狠色婷婷久久综合频道日韩| 久久99精品久久久久久久不卡| 国产精品欧美久久久久天天影视| 久久精品国产久精国产果冻传媒| 久久青青草原国产精品免费 | 91麻豆国产精品91久久久| 国产一级持黄大片99久久| 国内精品伊人久久久影院| 久久综合丝袜日本网| 色综合久久综合中文综合网| 久久99精品久久久久久不卡 | 九九久久精品无码专区| 色88久久久久高潮综合影院 | AV色综合久久天堂AV色综合在| 日韩十八禁一区二区久久| 久久精品人人做人人爽电影| 日本久久久久亚洲中字幕| 久久婷婷色综合一区二区| 久久久久综合国产欧美一区二区| 97久久综合精品久久久综合| 亚洲色婷婷综合久久| 久久这里只有精品首页| 国产精品久久久久a影院| 久久人人爽人爽人人爽av| 国产精品久久久99| 日韩欧美亚洲综合久久影院d3| 国产成人精品久久二区二区| 久久午夜羞羞影院免费观看| 无码精品久久久久久人妻中字| 97久久婷婷五月综合色d啪蜜芽| 久久久久99这里有精品10| 欧美激情一区二区久久久| 偷偷做久久久久网站| 青青草原精品99久久精品66|