青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

PKU3017

Posted on 2011-07-08 12:40 Mato_No1 閱讀(508) 評論(1)  編輯 收藏 引用 所屬分類: 平衡樹動態(tài)規(guī)劃
【原題見這里

本沙茶見過的最猥瑣的DP題啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊……

設(shè)F[i]為將A[1..i]拆分成若干段的最大值最小和,則有
F[i]=min{F[j] + max[j+1, i]}(B[i]<=j<i),其中max[j+1, i]表示A[j+1..i]中的最大值,B[i]表示從i向左最遠(yuǎn)可以延伸到哪里(也就是滿足SUM[x..i]<=m的最小的x值)。B數(shù)組可以通過預(yù)處理在O(N)時間內(nèi)得到。
邊界:F[0]=0。

下面是優(yōu)化過程。JZP神犇的論文里面已經(jīng)夠詳細(xì)了。這里只是簡要說明一下。
首先容易證明,F(xiàn)是單調(diào)遞增的。
然后一個很關(guān)鍵的定理是:若F[i]的最優(yōu)決策為j,則有A[j]>∀A[k](j<k<=i)。
證明:用反證法。若A[j+1..i]中存在不小于A[j]的值,則可得max[j..i]=max[j+1..i],又因?yàn)镕單調(diào)遞增,所以F[j-1]+max[j..i]<=F[j]+max[j+1.i],即決策(j-1)一定不比決策j差,也就是決策j不可能成為最優(yōu)決策。
這樣,可以維護(hù)一個下標(biāo)嚴(yán)格遞增、A值嚴(yán)格遞減的隊(duì)列Q(即對于隊(duì)列中的任意兩個元素Q[i]和Q[j],若i<j,則Q[i].pos<Q[j].pos且A[Q[i].pos]>A[Q[j].pos],具體實(shí)現(xiàn)時pos可省略)。則可能成為最優(yōu)決策的決策要么是在這個隊(duì)列Q里,要么是B[i]。對于隊(duì)列中的某個決策Q[x],該決策導(dǎo)出的值為F[Q[x]]+A[Q[x + 1]](很容易證明max[Q[x]+1..i]=A[Q[x + 1]]),找到這些導(dǎo)出的值中的最小值即可(注意,隊(duì)尾元素沒有導(dǎo)出值)。對于決策B[i],只需要在預(yù)處理的時候同時得到MAX[i]=max[B[i]+1..i]即可(也可以在O(N)時間內(nèi)得到),決策B[i]導(dǎo)出的值為F[B[i]]+MAX[i]。
在刪除隊(duì)首過時元素的時候,需要把導(dǎo)出值也刪除,刪除隊(duì)尾元素也一樣,插入的時候,若插入前隊(duì)列不為空,則需要插入一個導(dǎo)出值。也就是,需要一個支持在對數(shù)時間內(nèi)進(jìn)行插入、刪除任意結(jié)點(diǎn)、找最小值等操作,顯然用平衡樹最好。

注意事項(xiàng):
(1)不管是在隊(duì)首刪除還是在隊(duì)尾刪除,若刪除的是隊(duì)列中的最后一個元素,則不需要在平衡樹中刪除導(dǎo)出值;
(2)插入時,若插入前隊(duì)列為空,則不需要在平衡樹中插入導(dǎo)出值;
(3)在計(jì)算F[i]時,應(yīng)先將決策i壓入。

代碼:
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 100001;
struct node {
    
int l, r, p, sz0, sz, mul;
    
long long v;
} T[MAXN];
const long long INF = ~0Ull >> 2;
int n, N = 0, a[MAXN], b[MAXN], MAX[MAXN], Q[MAXN], front = 0, rear = -1, root = 0;
long long m, F[MAXN], res = 0;
void init()
{
    cin 
>> n >> m;
    re1(i, n) scanf(
"%d"&a[i]); a[0= ~0U >> 2;
}
void prepare()
{
    re1(i, n) 
if (a[i] > m) {res = -1return;}
    
int x = 1;
    
long long sum = 0;
    re1(i, n) {
        
for (sum+=a[i]; sum>m; sum-=a[x++]) ;
        b[i] 
= x - 1;
    }
    re1(i, n) {
        
for (; front<=rear && Q[front]<=b[i]; front++) ;
        
for (; front<=rear && a[Q[rear]]<=a[i]; rear--) ;
        Q[
++rear] = i; MAX[i] = a[Q[front]];
    }
}
void vst(int x)
{
    
if (x) {
        cout 
<< T[x].v << ' ';
        vst(T[x].l); vst(T[x].r);
    }
}
void slc(int _p, int _c)
{
    T[_p].l 
= _c; T[_c].p = _p;
}
void src(int _p, int _c)
{
    T[_p].r 
= _c; T[_c].p = _p;
}
void upd(int x)
{
    T[x].sz0 
= T[T[x].l].sz0 + T[T[x].r].sz0 + T[x].mul;
    T[x].sz 
= T[T[x].l].sz + T[T[x].r].sz + 1;
}
void lrot(int x)
{
    
int y = T[x].p;
    
if (y == root) T[root = x].p = 0else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
    src(y, T[x].l); slc(x, y); T[x].sz0 
= T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void rrot(int x)
{
    
int y = T[x].p;
    
if (y == root) T[root = x].p = 0else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
    slc(y, T[x].r); src(x, y); T[x].sz0 
= T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void maintain(int x, bool ff)
{
    
int z;
    
if (ff) {
        
if (T[T[T[x].r].r].sz > T[T[x].l].sz) {z = T[x].r; lrot(z);}
        
else if (T[T[T[x].r].l].sz > T[T[x].l].sz) {z = T[T[x].r].l; rrot(z); lrot(z);} else return;
    } 
else {
        
if (T[T[T[x].l].l].sz > T[T[x].r].sz) {z = T[x].l; rrot(z);}
        
else if (T[T[T[x].l].r].sz > T[T[x].r].sz) {z = T[T[x].l].r; lrot(z); rrot(z);} else return;
    }
    maintain(T[z].l, 
0); maintain(T[z].r, 1); maintain(z, 0); maintain(z, 1);
}
int find(long long _v)
{
    
int i = root;
    
long long v0;
    
while (i) {
        v0 
= T[i].v;
        
if (_v == v0) return i; else if (_v < v0) i = T[i].l; else i = T[i].r;
    }
    
return 0;
}
int Find_Kth(int K)
{
    
int i = root, s0, m0;
    
while (1) {
        s0 
= T[T[i].l].sz0; m0 = T[i].mul;
        
if (K <= s0) i = T[i].l; else if (K <= s0 + m0) return i; else {K -= s0 + m0; i = T[i].r;}
    }
}
void ins(long long _v)
{
    
if (!root) {
        T[
++N].v = _v; T[N].l = T[N].r = T[N].p = 0; T[N].sz0 = T[N].sz = T[N].mul = 1; root = N;
    } 
else {
        
int i = root, j;
        
long long v0;
        
while (1) {
            T[i].sz0
++; v0 = T[i].v;
            
if (_v == v0) {T[i].mul++return;} else if (_v < v0) j = T[i].l; else j = T[i].r;
            
if (j) i = j; else break;
        }
        T[
++N].v = _v; T[N].l = T[N].r = 0; T[N].sz0 = T[N].sz = T[N].mul = 1if (_v < v0) slc(i, N); else src(i, N);
        
while (i) {T[i].sz++; maintain(i, _v > T[i].v); i = T[i].p;}
    }
}
void del(int x)
{
    
if (T[x].mul > 1) {
        T[x].mul
--while (x) {T[x].sz0--; x = T[x].p;}
    } 
else {
        
int l = T[x].l, r = T[x].r, p;
        
if (l && r) {
            
int y; while (y = T[l].r) l = y;
            T[x].v 
= T[l].v; T[x].mul = T[l].mul; p = T[l].p;
            
if (l == T[p].l) slc(p, T[l].l); else src(p, T[l].l);
            
while (p) {upd(p); p = T[p].p;}
        } 
else {
            
if (x == root) T[root = l + r].p = 0else {p = T[x].p; if (x == T[p].l) slc(p, l + r); else src(p, l + r); while(p) {upd(p); p = T[p].p;}}
        }
    }
}
long long h(int x)
{
    
return F[Q[x]] + a[Q[x + 1]];
}
void solve()
{
    F[
0= 0; front = 0; rear = 0; Q[0= 0;
    re1(i, n) {
        
for (; front<=rear && Q[front]<b[i];) {if (front < rear) del(find(h(front))); front++;}
        
for (; front<=rear && a[Q[rear]]<=a[i];) {if (front < rear) del(find(h(rear - 1))); rear--;}
        Q[
++rear] = i; if (front < rear) ins(h(rear - 1));
        
if (root) F[i] = T[Find_Kth(1)].v; else F[i] = INF;
        
if (F[b[i]] + MAX[i] < F[i]) F[i] = F[b[i]] + MAX[i];
    }
    res 
= F[n];
}
void pri()
{
    cout 
<< res << endl;
}
int main()
{
    init();
    prepare();
    
if (!res) solve();
    pri();
    
return 0;
}

Feedback

# re: PKU3017  回復(fù)  更多評論   

2012-05-15 10:05 by olyminfo
求 JZP神犇的論文 出處。。。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品婷婷| 欧美在线黄色| 久久精品一二三区| 狠狠久久婷婷| 日韩午夜电影av| 午夜在线精品偷拍| 理论片一区二区在线| 在线精品国产欧美| 亚洲理伦在线| 久久精品麻豆| 欧美一区二区三区电影在线观看| 欧美在线视频网站| 久久精品一本久久99精品| 国产精品啊啊啊| 最新国产精品拍自在线播放| 一色屋精品视频在线观看网站| 亚洲视频精选| 亚洲欧美日韩在线| 亚洲视频香蕉人妖| 久久精品麻豆| 亚洲区第一页| 亚洲一区二区三区四区中文| 午夜视频久久久久久| 国产一区 二区 三区一级| 欧美在线网站| 亚洲国产精品第一区二区| 99综合电影在线视频| 欧美午夜电影网| 亚洲一级二级| 欧美.www| 欧美亚洲色图校园春色| 国产一区二区三区奇米久涩| 久久久久国产一区二区| 亚洲精品国产精品国自产观看浪潮| 亚洲女同同性videoxma| 国产自产精品| 欧美日韩一区二区在线| 亚洲欧美日韩天堂| 91久久久久久国产精品| 99re6这里只有精品| 亚洲欧美日韩一区| 91久久国产精品91久久性色| 国产一本一道久久香蕉| 在线综合视频| 欧美韩日一区二区| 亚洲欧美日韩精品| 蜜臀a∨国产成人精品| 亚洲精品综合在线| 亚洲制服少妇| 中日韩美女免费视频网址在线观看 | 亚洲一区二区三区精品在线观看 | 亚洲一区二区三区成人在线视频精品| 欧美高清视频| 欧美在线视频在线播放完整版免费观看| 欧美激情一区在线观看| 欧美a级大片| 欧美激情日韩| 午夜在线电影亚洲一区| 久久综合999| 免费视频久久| 欧美午夜片在线免费观看| 久久中文欧美| 亚洲电影天堂av| 亚洲国产欧美一区| 久久综合久久综合久久| 久久人人爽人人爽| 欧美激情国产日韩| 亚洲激情网站免费观看| 亚洲精品永久免费精品| 亚洲午夜av| 久久爱www.| 欧美xxx在线观看| 国产精品草莓在线免费观看| 亚洲电影下载| 牛人盗摄一区二区三区视频| 国产精品国产三级国产专播品爱网 | 午夜免费久久久久| 欧美电影在线播放| 亚洲国产精品成人综合| 久久精品日产第一区二区| 亚洲免费不卡| 国产精品sm| 亚洲一区二区影院| 亚洲视频精品在线| 欧美日韩免费观看一区二区三区| 亚洲精品欧美极品| 亚洲一区在线免费观看| 欧美视频一区二| 一区二区三区在线免费观看| 亚洲成人在线网| 欧美日韩精品欧美日韩精品| 国产精品午夜在线| 欧美精品手机在线| 久久综合中文字幕| 亚洲深夜影院| 亚洲欧美在线磁力| 久久美女艺术照精彩视频福利播放| 久久av一区二区三区漫画| 欧美日产在线观看| 免费高清在线一区| 亚洲一二区在线| 国产精品午夜在线| 久久综合九色九九| 久久中文字幕一区| 一区二区三区 在线观看视| 亚洲免费av片| 精品成人一区二区三区| 亚洲国产综合在线看不卡| 欧美精品系列| 久久久久女教师免费一区| 免费欧美在线视频| 亚洲大胆女人| 国产欧美大片| 麻豆久久久9性大片| 久久久精品国产免大香伊 | 欧美日韩一区二区三区高清| 亚洲一区二区三区精品在线| 亚洲一区视频在线观看视频| 亚洲精品国产系列| 欧美一区二区三区视频在线 | 久久久噜噜噜久久人人看| 欧美成人免费小视频| 久久精品九九| 国产精品少妇自拍| 亚洲免费av电影| 老司机一区二区三区| 欧美日韩精品免费在线观看视频| 久久尤物电影视频在线观看| 国产精品福利在线观看网址| 欧美成人一区二区三区片免费| 国产精品色午夜在线观看| 一区二区三区欧美激情| 亚洲少妇自拍| 欧美日韩国产bt| 亚洲精品日韩综合观看成人91| 亚洲国产精彩中文乱码av在线播放| 午夜精品www| 久久久久久久综合| 狠狠色狠狠色综合日日91app| 一区二区三区免费观看| 亚洲欧美日韩精品久久亚洲区 | 欧美一级电影久久| 欧美视频中文字幕在线| 亚洲精品欧美日韩| 亚洲天堂视频在线观看| 国产精品xnxxcom| 亚洲欧美日韩直播| 久久久久久午夜| 亚洲国产小视频| 欧美视频福利| 久久精品午夜| 91久久精品国产91性色tv| 夜夜精品视频一区二区| 国产精品va在线播放| 亚洲欧美日韩在线不卡| 国产一区二区三区网站| 久久看片网站| 在线视频亚洲一区| 久久乐国产精品| 一本色道久久综合亚洲精品高清 | 欧美福利视频网站| 亚洲一区二区三区久久| 激情久久综艺| 国产精品成人国产乱一区| 久久人人爽人人| 亚洲永久字幕| 亚洲精品乱码久久久久久按摩观 | 噜噜噜躁狠狠躁狠狠精品视频| 亚洲日本无吗高清不卡| 久久精品夜夜夜夜久久| 亚洲国产mv| 男女激情视频一区| 久久成人人人人精品欧| 夜夜嗨av色一区二区不卡| 亚洲国产精品高清久久久| 国产亚洲欧美日韩在线一区| 国产精品爽黄69| 欧美四级在线| 国产精品99免视看9| 欧美日韩亚洲国产精品| 欧美日韩高清在线| 亚洲一级一区| 亚洲女女女同性video| 亚洲一区二区三| 午夜精品美女久久久久av福利| 99re在线精品| 在线视频一区观看| 一区二区三区 在线观看视频| 日韩午夜中文字幕| 亚洲线精品一区二区三区八戒| 宅男噜噜噜66一区二区66| 亚洲一区不卡| 久久久精品性| 欧美黄在线观看| 国产精品高潮呻吟久久av无限| 国产精品白丝av嫩草影院| 国产综合欧美在线看| 亚洲第一在线| 亚洲天堂网在线观看| 欧美中文在线字幕|