BZOJ 2457 思維 貪心

2022-05-07 03:48:13 字數 1356 閱讀 4564

//為什麼我的chrome os更新後變成強制繁體了??

題目要求使用最少的雙端佇列來維護乙個單調非降序列

先來看下規律

首先,val肯定是單調非降的,在相等val範圍內的id可以xjb亂放不影響

其次,在單調可解的val範圍內,id一定是中間小兩邊大(中間是最初維護的,而兩邊是不斷地插入肯定越來越大)

即id在某一範圍內是v型分布的

因為val是單調的,所以對不同的val進行分塊管理對應的id,很顯然最低成立的條件是相同val(塊)的id肯定是緊挨著的,而且是每乙個塊逐步往右靠(單調嘛)

如果不可解,那就意味著id的分布至少是vv型的,即至少多了乙個極大值拐點,那麼拐點數+1就是使用佇列的數量

所以問題轉換成給定你未管理好的id,求最少的拐點數

貪心策略是能相同單調性就盡可能相同單調,否則相反單調

(乙個錯誤策略是盡可能遞減單調,因為當前遞減的話對應三種不同高度的右下""塊狀id是最優的,然而gg,原因待查)

ac程式碼

/*h e a d*/

struct aa[maxn];

bool cmp(a a,a b)else

}int ans=0;

rep(i,1,now) sort(block[i].begin(),block[i].end(),cmp);//trend=+1

vectorque;

int trend;

rep(i,1,now)

trend=-1;

}else if(trend==-1)

trend=-1;

}else

trend=1;

}}else

trend=1;

}else

trend=-1;

ans++;}}

}println((ans+1));

}return 0;

}

錯誤策略部分程式碼

rep(i,1,now)

trend=-1;

}else if(trend==-1)

trend=1;

// ans++;

}else if(block[i].back().id= 0; j--)

trend=-1;

}else

trend=-1;

ans++;

}}else

trend=1;

}else if(block[i].back().id= 0; j--)

trend=-1;

ans++;

}else

trend=-1;

ans++;

}}

BZOJ 2457 雙端佇列 思維

bzo j2457雙端 佇列bz oj24 57雙端 佇列de scri ptio ndes crip tion sherry現在碰到了乙個棘手的問題,有 個整數需要排序。sherry手頭能用的工具就是若干個雙端佇列。她需要依次處理這n個數,對於每個數,sherry能做以下兩件事 1 新建乙個雙端佇...

BZOJ 2457 雙端佇列

sherry 現在碰到了乙個棘手的問題,有 個整數需要排序。sherry 手頭能用的工具就是若干個雙端佇列。她需要依次處理這 n 個數,對於每個數,sherry 能做以下兩件事 1 新建乙個雙端佇列,並將當前數作為這個佇列中的唯一的數 2 將當前數放入已有的佇列的頭之前或者尾之後。對所有的數處理完成...

BZOJ 2457雙端佇列題解

我們之前學習了如何使用stl中的佇列 現在我們來看一道與佇列有關的神奇的題 看似佇列而非為佇列 雙端佇列 分析 如果現在有一段序列 ai,ai 1,ai 2,aj 1,aj 滿足該雙端佇列的要求,即滿足 aj 1 ai 1 如下 include include include include inc...