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

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>
            欧美黄色日本| 亚洲欧美一区二区三区久久 | 性做久久久久久免费观看欧美| 午夜精品福利在线| 国产精品久久久久久妇女6080| 性欧美1819sex性高清| 日韩视频免费观看高清在线视频| 欧美少妇一区二区| 亚洲福利视频网| 午夜精品免费在线| 亚洲欧美日韩在线观看a三区| av成人免费| 亚洲深夜福利在线| 亚洲专区在线视频| 欧美在线观看视频一区二区三区| 羞羞视频在线观看欧美| 久久理论片午夜琪琪电影网| 美女爽到呻吟久久久久| 亚洲福利国产| 99视频一区二区| 亚洲欧美激情一区| 久久亚洲一区二区| 欧美久色视频| 国产精品女人久久久久久| 国产一区二区三区黄| 在线日韩一区二区| 在线一区二区三区四区五区| 午夜精品一区二区在线观看| 国产精品久久久久av免费| 国产乱码精品一区二区三区不卡| 精品电影一区| 国产精品99久久久久久www| 久久精品毛片| 亚洲精品一区二区三区樱花| 亚洲午夜电影| 免费成人你懂的| 欧美午夜片在线观看| 国产亚洲欧洲一区高清在线观看 | 亚洲毛片在线观看.| 午夜精品久久久99热福利| 久久人人超碰| 国产精品网站在线观看| 亚洲高清电影| 久久福利视频导航| 99av国产精品欲麻豆| 久久久久久一区| 国产精品毛片va一区二区三区| 亚洲国产精品成人综合| 久久av老司机精品网站导航| 日韩午夜av| 欧美成人一区在线| 精品成人在线| 久久精品国产免费观看| 中文成人激情娱乐网| 欧美成人网在线| 激情欧美一区二区| 久久国产日韩| 午夜精品福利在线| 国产精品午夜久久| 亚洲在线观看视频| 亚洲激情国产| 欧美sm极限捆绑bd| 亚洲国产日韩一区| 男女激情久久| 久久久久亚洲综合| 红桃视频成人| 久久久精品动漫| 午夜国产精品影院在线观看| 国产精品一区视频| 午夜国产精品视频| 亚洲主播在线观看| 国产日韩一区二区| 久久精品1区| 欧美诱惑福利视频| 国内精品免费在线观看| 久久精品二区| 久久狠狠一本精品综合网| 国内精品久久久久久久97牛牛| 久久精品国产亚洲一区二区| 午夜国产精品视频免费体验区| 国产日韩高清一区二区三区在线| 欧美一区二区三区四区在线观看地址 | 欧美美女操人视频| 一区二区三区日韩精品视频| 99xxxx成人网| 国产精品盗摄久久久| 欧美一区二区三区播放老司机| 午夜精品一区二区在线观看| 韩国自拍一区| 欧美激情亚洲精品| 欧美视频在线观看| 久久精品最新地址| 久久天天躁狠狠躁夜夜av| 亚洲三级影片| 亚洲视频欧美视频| 极品少妇一区二区| 亚洲二区在线| 国产精品九九久久久久久久| 久久久综合网站| 欧美激情在线有限公司| 亚洲国产精品电影| 欧美性淫爽ww久久久久无| 久久黄色网页| 欧美激情国产高清| 久久er99精品| 欧美成人免费一级人片100| 亚洲婷婷综合久久一本伊一区| 亚洲欧美一区二区三区在线| 1024欧美极品| 亚洲桃色在线一区| 永久91嫩草亚洲精品人人| 亚洲精选久久| 精品成人在线| 亚洲一区二区动漫| 亚洲精品欧洲| 性色av一区二区三区在线观看| 亚洲精品一区在线观看| 小黄鸭精品密入口导航| 日韩午夜电影在线观看| 性色一区二区三区| 亚洲一区在线免费观看| 蜜臀久久99精品久久久画质超高清 | 国产伦精品一区二区三区照片91| 亚洲第一在线综合网站| 国产欧美日韩综合| 99re66热这里只有精品4| 在线观看中文字幕不卡| 亚洲一区二区日本| 99re66热这里只有精品4| 久久精品视频在线播放| 西瓜成人精品人成网站| 欧美伦理a级免费电影| 欧美黑人多人双交| 亚洲高清资源综合久久精品| 午夜在线精品| 欧美一区视频在线| 国产精品免费观看视频| 日韩小视频在线观看| 99国产麻豆精品| 欧美成人免费视频| 亚洲日韩欧美一区二区在线| 亚洲日本中文字幕| 欧美激情视频在线免费观看 欧美视频免费一 | 国产乱肥老妇国产一区二 | 久久久久久国产精品一区| 欧美视频在线播放| 亚洲深夜福利视频| 亚洲永久免费视频| 国产精品欧美久久| 亚洲欧美日韩在线不卡| 欧美呦呦网站| 韩国精品在线观看| 久久综合久久综合久久综合| 欧美福利电影在线观看| 亚洲国产欧美一区| 久久精品国产一区二区三区| 国产精品久久久久三级| 亚洲欧美在线免费观看| 久久久综合精品| 亚洲精品美女在线| 欧美三级不卡| 亚洲欧美日韩成人| 久久亚洲一区二区| 亚洲黄网站黄| 欧美久久久久久久久| 亚洲一区免费视频| 久久久久国产精品www| 久久福利电影| 可以看av的网站久久看| 国产真实久久| 欧美激情亚洲精品| 亚洲国产精选| 一区二区三区精品久久久| 国产精品久久久久毛片软件| 亚洲午夜激情免费视频| 欧美一区二区视频观看视频| 国产老女人精品毛片久久| 欧美xx视频| 91久久精品日日躁夜夜躁欧美| 亚洲精品一二| 久久久久久穴| 一区二区三区视频观看| 午夜精品久久| 国产一区二区三区奇米久涩| 欧美一区二区三区男人的天堂| 久久久视频精品| 亚洲国产天堂久久综合| 欧美激情一区二区三级高清视频| 亚洲欧美日本国产有色| 久久亚洲二区| 日韩视频在线观看免费| 欧美日韩你懂的| 久久躁狠狠躁夜夜爽| 亚洲国产精品专区久久| 亚洲一区二区三区在线视频 | 免费h精品视频在线播放| 久久久99免费视频| 红桃视频一区| 欧美激情一区二区三区在线视频观看 | 欧美伊人久久久久久午夜久久久久 |