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

PKU3017

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

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

設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向左最遠可以延伸到哪里(也就是滿足SUM[x..i]<=m的最小的x值)。B數組可以通過預處理在O(N)時間內得到。
邊界:F[0]=0。

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

注意事項:
(1)不管是在隊首刪除還是在隊尾刪除,若刪除的是隊列中的最后一個元素,則不需要在平衡樹中刪除導出值;
(2)插入時,若插入前隊列為空,則不需要在平衡樹中插入導出值;
(3)在計算F[i]時,應先將決策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  回復  更多評論   

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>
            欧美日韩视频在线一区二区| 伊人精品视频| 亚洲精品国产拍免费91在线| 亚洲精品免费看| 精品1区2区| 在线观看亚洲视频啊啊啊啊| 尤物yw午夜国产精品视频| 狠狠爱综合网| 亚洲经典在线看| 亚洲三级国产| 亚洲综合丁香| 久久精品99国产精品日本| 久色婷婷小香蕉久久| 女同性一区二区三区人了人一| 美女视频黄a大片欧美| 亚洲第一综合天堂另类专| 欧美激情在线播放| 99爱精品视频| 久久xxxx| 欧美激情一区二区三区在线视频| 欧美黄色免费网站| 欧美午夜视频在线| 国产自产v一区二区三区c| 欧美激情一区二区三级高清视频| 好看的日韩视频| 夜夜嗨av一区二区三区四季av | 久久久国际精品| 欧美精品1区2区3区| 麻豆成人91精品二区三区| 久久久综合视频| 亚洲欧美日韩国产中文| 久久综合图片| 亚洲婷婷综合色高清在线| 老色鬼久久亚洲一区二区| 国产精品专区第二| 一区二区激情小说| 欧美国产精品v| 亚洲欧美日韩综合一区| 欧美日韩精品免费观看| 亚洲第一毛片| 久久久久青草大香线综合精品| 亚洲麻豆一区| 欧美黄色精品| 亚洲精品国产视频| 米奇777超碰欧美日韩亚洲| 亚洲一区在线观看视频 | 日韩一级精品视频在线观看| 久久性色av| 午夜视频在线观看一区二区三区| 欧美另类一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了 | 久久精品免视看| 国产亚洲一区二区三区在线观看| 亚洲摸下面视频| 一个人看的www久久| 欧美日韩一区成人| 亚洲视频精品在线| av不卡在线| 国产精品久久久久久久电影| 亚洲一区中文字幕在线观看| 一区二区三区高清在线观看| 欧美性猛交xxxx乱大交退制版| 日韩一级精品| 日韩视频在线免费| 国产精品久久久久久久久借妻| 亚洲午夜一区二区三区| 在线一区免费观看| 国产欧美日韩亚洲精品| 久久久国产精品一区| 久久性天堂网| 日韩亚洲欧美高清| 亚洲精品久久久久久一区二区 | …久久精品99久久香蕉国产| 国产亚洲精品美女| 久久一区国产| 久久亚洲不卡| 一区二区三区久久精品| 亚洲午夜一二三区视频| 国产一区二区三区无遮挡| 欧美成人免费网| 亚洲女同精品视频| 欧美电影在线播放| 欧美精品自拍偷拍动漫精品| 一区二区三区四区国产精品| 亚洲永久免费精品| 狠狠久久亚洲欧美专区| 亚洲电影中文字幕| 欧美视频中文在线看| 久久精选视频| 欧美精品一区二区三区久久久竹菊 | 亚洲高清视频在线| 欧美日韩一区不卡| 久久久久青草大香线综合精品| 影视先锋久久| 国产伦精品免费视频| 欧美大片免费看| 国产精品久久久久一区| 欧美福利精品| 欧美精品自拍偷拍动漫精品| 午夜久久tv| 欧美精品123区| 久久美女艺术照精彩视频福利播放| 久久天天躁狠狠躁夜夜av| 亚洲午夜精品视频| 六月丁香综合| 久久久蜜桃一区二区人| 国产精品久久久久一区二区| 亚洲福利一区| 黄色成人av网| 亚洲欧美福利一区二区| 中文亚洲欧美| 欧美顶级艳妇交换群宴| 免费成人高清视频| 国产综合一区二区| 亚洲欧美激情诱惑| 亚洲一区二区三区四区中文| 欧美极品影院| 欧美激情一区在线| 亚洲黄色成人网| 久久人人精品| 老司机一区二区三区| 国产一区二区三区黄视频| 亚洲视频在线看| 亚洲一区日本| 99成人精品| 欧美激情精品久久久久久| 好看不卡的中文字幕| 欧美在线黄色| 久久婷婷一区| 激情91久久| 久久日韩精品| 欧美激情91| 日韩天堂av| 欧美日韩国产综合网 | 欧美在线视频免费播放| 亚洲欧美区自拍先锋| 久久久久女教师免费一区| 久久精品视频播放| 欧美一区免费| 国产精品一区=区| 性欧美1819sex性高清| 久久精品人人做人人爽电影蜜月| 国产日韩精品久久| 欧美一区国产在线| 鲁大师影院一区二区三区| 亚洲电影天堂av| 蜜桃久久av| 亚洲人永久免费| 亚洲色图自拍| 国产欧美综合一区二区三区| 亚洲欧美一级二级三级| 久久久综合精品| 91久久久久久国产精品| 欧美日韩高清不卡| 欧美国产日韩二区| 日韩亚洲欧美一区| 国产毛片精品国产一区二区三区| 欧美在线视频观看| 亚洲国产乱码最新视频| 亚洲一区亚洲二区| 国产亚洲欧美激情| 美国三级日本三级久久99| 日韩视频免费观看高清在线视频| 亚洲欧美色婷婷| 国内精品一区二区| 欧美久久一级| 欧美一级免费视频| 91久久久久| 久久久无码精品亚洲日韩按摩| 亚洲激情在线| 国产精品推荐精品| 欧美电影资源| 久久精品国产综合精品| 一二三区精品福利视频| 免费的成人av| 欧美一区=区| 夜夜嗨av色一区二区不卡| 国产主播喷水一区二区| 欧美区在线观看| 久久精品人人做人人爽电影蜜月| 亚洲美女毛片| 欧美国产第二页| 久久视频这里只有精品| 亚洲女女女同性video| 亚洲区中文字幕| 国产一区二区三区av电影| 欧美视频免费在线| 欧美大片免费久久精品三p | 久久精品国产在热久久| 9l国产精品久久久久麻豆| 激情丁香综合| 国产欧美大片| 欧美日韩精品系列| 美女图片一区二区| 久久www成人_看片免费不卡| 亚洲伊人第一页| 夜夜嗨av色一区二区不卡| 亚洲国产aⅴ天堂久久| 蜜臀av在线播放一区二区三区| 香蕉久久精品日日躁夜夜躁|