網上大部分都是並查集寫法,但是有大神寫了非並查集寫法,特別容易理解
首先 \(s_i\) 的限制,只需將每乙個蔬菜分出乙個價值為 \(a_i+s_i\) 且過期時間為該蔬菜最晚的一天的蔬菜
把時間倒序之後,問題轉化為每個蔬菜會在第幾天出現,每天貪心選擇價值最大的即可
先求出 \(\max \\) 的答案,然後遞推 \([1,\max \-1]\) 的答案:每次刪除價值最小的 \(m\) 單位蔬菜,不難發現所有蔬菜的銷售時間依然合法
#include#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int maxn=100000+10,p=100000;
int n,m,k,a[maxn],c[maxn],x[maxn],s[maxn],vis[maxn];
ll ans[maxn],sale[maxn],tot;
struct node;
};std::vectorv[maxn];
std::queuered;
std::priority_queueq1;
std::priority_queue< node,std::vector,std::greater> q2;
templateinline void read(t &x)
templateinline void write(t x,char ch='\0')
templateinline void chkmin(t &x,t y)
templateinline t min(t x,t y)
int main()
for(register int i=p;i>=1;--i)
); else if(sale[now.id])q2.push((node));}}
tot=1ll*m*i;
} for(register int i=1,x;i<=k;++i)read(x),write(ans[x],'\n');
return 0;
}
刷題 BZOJ 5415 Noi2018 歸程
考試的時候打的可持久化並查集,沒調出來qaq 後面知道了kruskal重構樹這個東西,感覺好簡單啊 這道題就建出kruskal重構樹後,對於兩個點找到它們的lca,其子樹min就是答案 include define ui unsigned int define ll long long define...
LeetCode刷題系列20
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...
刷題 力扣 20
題目鏈結 題目描述 給定乙個只包括 的字串 s 判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。示例 1 輸入 s 輸出 true示例 2 輸入 s 輸出 true示例 3 輸入 s 輸出 false示例 4 輸入 s 輸出 false示例 5 輸入 ...