【題目描述】
【題解】
這道題可以從後往前貪心。
若我們知道了第i的答案,我們只要去掉(當前個數-前i-1天能取的個數)個價值最小的蔬菜,就能得到第i-1天的答案。
所以我們現在只要求出最後一天的答案。
把每種蔬菜拆成兩份,前c-1個價值為a,最後乙個價值為a+s(按變質的順序)放入優先佇列中,依次取出來放入還能放的地方即可。
還能放的地方可以用並查集維護。
複雜度o(n log n)。
/* --------------
user vanisher
problem bzoj-4946
----------------*/
# include # define ll long long
# define n 1000100
using namespace std;
ll read()
while (ch>='0'&&ch<='9')
return tmp*fh;
}struct node;
bool operator <(node x, node y)
int main()); hp.push((node));
} else );
hp.push((node));
} }mx=100000;
for (ll i=1; i<=k; i++) p[i]=read(),mx=max(p[i],mx);
for (ll i=1; i<=mx; i++) f[i]=i, num[i]=m;
while (hp.size()!=0)
else
} }sort(mp+1,mp+cnt+1);
ll tot=mx*m,now=ans[mx],l=1;
for (ll i=mx-1; i>=1; i--)
for (ll i=1; i<=k; i++)
printf("%lld\n",ans[p[i]]);
return 0;
}
BZOJ 4942 NOI2017 整數 分塊
bzoj 洛谷uoj 可能是退役之前最後乙個bzoj rank1了?參考這裡。如果沒有減法,對乙個二進位制數暴力進製,均攤複雜度是 o 1 的 要進 o n 次位就至少需要 o n 次操作 但是這題有減法.顯然暴力進製就不對了。那麼我們把減法變成加法,分別維護加上的數 inc 和減掉的數 dec 是...
刷題 BZOJ 4946 Noi2017 蔬菜
網上大部分都是並查集寫法,但是有大神寫了非並查集寫法,特別容易理解 首先 s i 的限制,只需將每乙個蔬菜分出乙個價值為 a i s i 且過期時間為該蔬菜最晚的一天的蔬菜 把時間倒序之後,問題轉化為每個蔬菜會在第幾天出現,每天貪心選擇價值最大的即可 先求出 max 的答案,然後遞推 1,max 1...
NOI2017 蚯蚓排隊
嘟嘟嘟 現在看來這道題還不是特別難。別一看到字串就想sam 看到 k 很小,所以我們可以搞乙個單次修改複雜度跟 k 有關的演算法。能想到,每一次斷開或鏈結,最多隻會影響 k 2 個長度為 k 的區間。所以我們開乙個雜湊表,每一次拼接時就往雜湊表裡加入 k 2 個新的雜湊值,斷鏈的時候就把這些雜湊值減...