權值線段樹

 

https://blog.csdn.net/lzc504603913/article/details/83240651ios

題意:有不少個活動,每一個活動有持續天數,每一個活動會在天天提供C個CPU每一個CPU價格爲P,問須要工做N天,天天須要K個CPU的最少花費。c++

 

解題思路:首先價格越低的活動,確定是要選的。所以咱們對於每一天記錄有哪些新活動 加入,哪些活動結束。而後維護一個線段樹,線段樹的下標是價格。即價格爲i的活動,一共能提供多少個CPU,而後加入和刪除活動就至關於update(C,+-P,1,MAXC,1)。 而後咱們順便維護一下價格*數量的和。而後利用線段樹自然的二分性,快速求出前綴數量和爲K的價格和。

ide

 

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: QWX
 4     > Mail: 
 5     > Created Time: 2018/11/19 22:39:42
 6  ************************************************************************/
 7 
 8 
 9 //{{{ #include
10 #include<iostream>
11 #include<cstdio>
12 #include<algorithm>
13 #include<vector>
14 #include<cmath>
15 #include<queue>
16 #include<map>
17 #include<set>
18 #include<string>
19 #include<cstring>
20 #include<complex>
21 #include<cassert>
22 //#include<bits/stdc++.h>
23 #define vi vector<int>
24 #define pii pair<int,int>
25 #define mp make_pair
26 #define pb push_back
27 #define fi first
28 #define se second
29 #define pw(x) (1ll << (x))
30 #define sz(x) ((int)(x).size())
31 #define all(x) (x).begin(),(x).end()
32 #define rep(i,l,r) for(int i=(l);i<(r);i++)
33 #define per(i,r,l) for(int i=(r);i>=(l);i--)
34 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
35 #define cl(a,b) memset(a,b,sizeof(a))
36 #define fastio ios::sync_with_stdio(false);cin.tie(0);
37 #define lson l , mid , ls
38 #define rson mid + 1 , r , rs
39 #define INF 0x3f3f3f3f
40 #define LINF 0x3f3f3f3f3f3f3f3f
41 #define ll long long
42 #define ull unsigned long long
43 #define dd(x) cout << #x << " = " << (x) << "," 
44 #define de(x) cout << #x << " = " << (x) << "\n" 
45 #define endl "\n"
46 using namespace std;
47 //}}}
48 const int N=1e6+7;
49 
50 struct Set{
51 #define ls rt<<1
52 #define rs ls|1
53     static const int N=::N<<2;
54     ll sum[N],cnt[N];
55     void up(int rt){
56         cnt[rt]=cnt[ls]+cnt[rs];
57         sum[rt]=sum[ls]+sum[rs];
58     }
59     void upd(int p,ll c,int l,int r,int rt){
60         if(l==r){
61             cnt[rt]+=c;
62             sum[rt]=cnt[rt]*l;
63             return ;
64         }
65         int mid=l+r>>1;
66         if(p<=mid)upd(p,c,l,mid,ls);
67         else upd(p,c,mid+1,r,rs);
68         up(rt);
69     }
70     ll qry(ll k,int l,int r,int rt){
71         if(cnt[rt]<=k)return sum[rt];
72         int mid=l+r>>1; 
73         if(l==r)return k*l;
74         if(cnt[ls]>=k)return qry(k,l,mid,ls);
75         return sum[ls]+qry(k-cnt[ls],mid+1,r,rs);
76     }
77 }seg;
78 vector<pii>V[N];
79 
80 int main()
81 {
82     int n,k,m; cin>>n>>k>>m;
83     ll ans=0;
84     rep(i,0,m){
85         int a,b,c,d; cin>>a>>b>>c>>d;
86         V[a].pb(mp(c,d));V[b+1].pb(mp(-c,d));
87     }
88     FOR(i,1,n){
89         for(auto &t:V[i]){
90             seg.upd(t.se,t.fi,1,1e6,1);
91         }
92         ans+=seg.qry(k,1,1e6,1);
93     }
94     cout<<ans<<endl;
95     return 0;
96 }
View Code
相關文章
相關標籤/搜索