NOI2017 蔬菜 時光倒流 貪心

2022-02-05 22:24:17 字數 2832 閱讀 8614

題目鏈結

題解:貌似一眼看過去是乙個貪心。

其他的演算法要記錄的東西就太多了。

部分分其實很高。但是沒有什麼提示。

想一些套路:二分?不行還要貪心判斷。

分治?前後取法是有影響的。

時光倒流?

也許可以?

其實比較麻煩的是蔬菜變質。這樣就使得我們不能每次賣最貴的。

如果時光倒流,那麼就會有些蔬菜在某乙個時刻以某乙個初值出現,然後每過一天,增長固定的個數。

那麼,面對最後一天,我們就剩下這麼多的菜了。肯定要賣最貴的m個

然後,倒數第二天,一些蔬菜出現了,一些蔬菜變多了,我們在最後一天賣菜的基礎上,可以繼續選擇最貴的m個。

因為,最後一天的菜和倒數第二天的菜交換一定不優,因為可能倒數第二天能買到的,最後一天就壞了。而由於取最大的m個,某天賣其他的菜也不會更優。

類似數學歸納法可以證明。

現在我們可以找出來p天的最大收益了。

但是,詢問太多了, 可以不可以遞推呢?

可以。求出max(pi)的值mxans

然後,每往前提一天,那麼,就把所有賣過的菜中,刪掉最便宜的m個。

合法顯然,因為後面能賣的,前面一定能賣、

如果不賣這些,同層之間交換不優的。

離線處理,然後倒序遞推即可。

細節比較多:

1.不能除以0

2.等等

**:

#pragma gcc optimize(2)

#pragma gcc optimize(3)

#pragma gcc optimize"ofast"#include

#define ri register int

using

namespace

std;

#define int long long

#define numb (ch^'0')typedef

long

long

ll;const

int n=2e5+5

;void rd(int &x)

struct

node

}sta[n];

inttop;

ll mxans;

intval[n],c[n],s[n],dele[n];

intsell[n];

intpriority_queue

q1;struct

bac};

priority_queue

q2;int

n,m,k;

struct

question

}que[n];

ll ans[n];

intup;

intid[n];

vector

mem[n];//

bool cmp(int a,int

b)signed main()

for(int i=1;i<=k;i++)sort(que+1,que+k+1

); up=que[1

].day;

//coutcout<<" up "rem[i+n]=1

; dele[i+n]=0

; c[i+n]=1

; val[i+n]=s[i]+val[i];

c[i]--;

if(c[i]==0) continue;//

warning!!

int exi=(c[i]+dele[i]-1)/dele[i];

int re=c[i]%dele[i];

if(re==0) re=dele[i];

if(exi>up)

mem[exi].push_back(i);

}

//for(int i=1;i<=2*n;i++)

if(fl)

sort(id+1,id+2*n+1

,cmp);

int ptr=k;

if(que[ptr].day==0) ptr--;

int r=1

;

//cout<<" day "//cout<<" nd "while(que[ptr].day==d&&ptr)

//cout<}

//coutreturn0;

}for(ri i=up;i>=1;i--)

int nd=m;

while

(nd)

else

if(now.id<=n) sta[++top]=now;//

warning!! id>n not push back

}

while

(top)

//cout<<" after "<}

ans[que[

1].id]=mxans;

if(k==1

)

int tot=0

;

for(ri i=1;i<=2*n;i++)

}int ptr=2

;

for(ri i=up;i>=1;i--)

if((i-1)*m>=tot) continue;//

warning!!!

if(i==1) break

;

int nd=min(m,tot-((i-1)*m));

while

(nd)

else}}

for(int i=1;i<=k;i++)

return0;

}/*author: *miracle*

date: 2018/10/14 14:19:49

*/

NOI2017 蚯蚓排隊

嘟嘟嘟 現在看來這道題還不是特別難。別一看到字串就想sam 看到 k 很小,所以我們可以搞乙個單次修改複雜度跟 k 有關的演算法。能想到,每一次斷開或鏈結,最多隻會影響 k 2 個長度為 k 的區間。所以我們開乙個雜湊表,每一次拼接時就往雜湊表裡加入 k 2 個新的雜湊值,斷鏈的時候就把這些雜湊值減...

NOI2017蚯蚓排隊

原題鏈結 發現 k 50 在插入和刪除時最多會影響不超過 k2 個串,用鍊錶實現插入和刪除,然後只需用雜湊表維護每個長度不超過k的串的出現次數,雜湊的話可以先用比較大的範圍的值處理衝突,再對映到1e8的桶裡統計。考慮複雜度。首先在刪除時由於保證了 c 1000 所以這部分複雜度是o ck2 的。插入...

NOI2017醬油記(偽)

好吧其實是因為菜沒拿到名額才去打同步賽的。day1 拿到題面 1.不存在的 2.tan 90 3.辣雞吉利 臥槽,全是假題。此時skydec在裙上說第三道用dp騙分。於是我就愉快的擼了乙個小時擼出來了。然後一看t2,好像可以雜湊呀 然後就愉快的花了乙個小時碼碼碼 半個小時之後調完了。然後看第一道。還...