日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P4602 [CTSC2018]混合果汁(主席树)

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4602 [CTSC2018]混合果汁(主席树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P4602 [CTSC2018]混合果汁

共有nnn種果汁,第iii種果汁的美味度為did_idi?,每升價格為pip_ipi?,在一瓶混合果汁中,最多只能添加lil_ili?升。

mmm個詢問,每次詢問給出兩個數g,Lg, Lg,L,我們要找出價格不大于ggg,體積不小于LLL的混合果汁的最大美味度。

混合果汁的美味度為所有參與混合的果汁的最小值,如果沒有滿足條件的混合果汁則輸出?1-1?1

把果汁按照美味度排一個序,對每個詢問二分枚舉did_idi?,然后judge[i,n][i, n][i,n]上的果汁是否可以混合得到滿足要求,

當美味度最小值確定了,我們如何挑選果汁,不難想到,肯定是優先選價格更低的,然后次小的,依次類推,

我們按照美味值的相對順序排序,然后以價格為下標建立主席樹,這樣我們就只要在[mid+1,n][mid + 1, n][mid+1,n]區間的主席樹上去判斷何不合法就行,

單次求解的復雜度是log?2n\log ^ 2 nlog2n的,感覺好像用不用整體二分效率應該是差不多的吧,整體復雜度都是Olog?2nO \log ^ 2 nOlog2n的。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10, maxn = 100000;int n, m, num, a[N], ans[N], root[N], ls[N << 5], rs[N << 5];long long sum[N << 5], cost[N << 5];struct Res {int d, p, l;void read() {scanf("%d %d %d", &d, &p, &l);}bool operator < (const Res &t) const {return d < t.d;} }s[N];struct Ans {int id;long long g, l; }q[N], q1[N], q2[N];void update(int &rt, int pre, int l, int r, int x, int v) {rt = ++num;ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre] + v, cost[rt] = cost[pre] + 1ll * x * v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);} }bool judge(int rt1, int rt2, int l, int r, long long pre_G, long long pre_L, long long G, long long L) {if (l == r) {if (pre_L + sum[rt2] - sum[rt1] < L) {return false;}return pre_G + (L - pre_L) * l <= G;}int mid = l + r >> 1;if (pre_L + sum[ls[rt2]] - sum[ls[rt1]] >= L) {return judge(ls[rt1], ls[rt2], l, mid, pre_G, pre_L, G, L);}else {pre_L += sum[ls[rt2]] - sum[ls[rt1]];pre_G += cost[ls[rt2]] - cost[ls[rt1]];return judge(rs[rt1], rs[rt2], mid + 1, r, pre_G, pre_L, G, L);} }void solve(int l, int r, int L, int R) {if (l > r | L > R) {return ;}if (l == r) {for (int i = L; i <= R; i++) {ans[q[i].id] = l;}return ;}int mid = l + r >> 1, cnt1 = 0, cnt2 = 0;for (int i = L; i <= R; i++) {if (judge(root[mid], root[n], 1, maxn, 0, 0, q[i].g, q[i].l)) {q2[++cnt2] = q[i];}else {q1[++cnt1] = q[i];}}for (int i = 1; i <= cnt1; i++) {q[L + i - 1] = q1[i];}for (int i = 1; i <= cnt2; i++) {q[L + cnt1 + i - 1] = q2[i];}solve(l, mid, L, L + cnt1 - 1), solve(mid + 1, r, L + cnt1, R); }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);a[1] = -1;for (int i = 2; i <= n + 1; i++) {s[i].read();a[i] = s[i].d;}n++;sort(a + 1, a + 1 + n);sort(s + 1, s + 1 + n);for (int i = 2; i <= n; i++) {update(root[i], root[i - 1], 1, maxn, s[i].p, s[i].l);}for (int i = 1; i <= m; i++) {long long g, l;scanf("%lld %lld", &g, &l);q[i] = {i, g, l};}solve(1, n, 1, m);for (int i = 1; i <= m; i++) {printf("%d\n", a[ans[i]]);}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的P4602 [CTSC2018]混合果汁(主席树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。