這題用單調佇列需要分析好,當然也是自己思維不靈活,老想套用其他題的方法。
題意:求出字串和,使其滿足sum%p<=k使sum/p最大
單調佇列,自己理解主要在於每次更新操作覆蓋掉無用的部分,即根據單調關係那部分在以後的判斷都是無用的那一部分,從而使效率提高,而不要盲目的去退隊從而將有用的部分去掉使答案錯誤。
這題單調佇列pos最小為隊頭,保證了pos最小即得出的sum[k]-sum[s[top]]最大,然後便是對a[i].x的判斷,因為排序後a[i].x遞增的關係若前面i減去隊頭後x 餘數比k大,則後面減出的餘數便更大。
這題也可以用線段樹和樹狀陣列。
**:#include#include#includeusing namespace std;
struct nodea[2000010],s[2000010];
int cmp(node a,node b)
sort(a+1,a+n+1,cmp);
int ans=-1; int temp=0;int top=0;int tail=0;int last=0;
for(int k=1;k<=n;k++)
{while(topk) top++;
int t=a[k].pos;
if(f[t]%p<=k) ans=max(ans,f[t]/p);
else if(top
hdu2430 Beans 單調佇列
hdu2430 beans 單調佇列 題目意思 求乙個sum p k的max sum p 結題報告 技巧,先求出字首和,並記錄前i項對p取餘的值記為x,並記下位置pos 依照先按x從小到大。假設x同樣按pos從小到大排序。這樣,問題就轉換為 求乙個最小的pos使得pos到i的值最大。單調佇列裡面保持...
hdu 2430 線段樹維護下標
求一段連續的區間,使其在滿足 和 對p取餘不超過k的 前提 下 和最大 做法 用線段樹維護區間最小值,最小的下標,即最左邊,因為加入sum i p k就要減去乙個sum id sum id p在 sum i p k,sum i p 之間,sum i sum id 的值就為以i結尾的滿足條件的連續的一...
單調佇列 1005 HDU 2430 Beans
題意 有n袋大豆,每袋大豆裡有w i 個大豆,現在有容量為p的包 問你選任意長度的連續區間,這個區間滿足sum p k sum是區間的和 答案使sum p最大 思路 區間嘛,很容易想到字首和來表示區間和 區間 j 1 i就是sum i sum j 為了使sum j 好表示些,所以前邊用了j 1 判斷...