Segment tree + dp

Portal

include

include

define ll long long

define lson l, m, rt << 1 // left his son

define rson m+1,r,rt<<1|1//右儿子

define inf 0x3f3f3f3f

using namespace std;
const int maxn = 1e5 + 5;
int n,m,sum[maxn<<2],tree[maxn<<2];
int k;
int c[maxn],dp[maxn];
int ans = 0;
int w[maxn];
int R,L,C;
int read(){//快速读入数字
int a=0;char x=getchar();bool f=0;
while((x<'0'||x>'9')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=1;
while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
return f?-a:a;
}
void pushup(int rt){
sum[rt] = min(sum[rt<<1], sum[rt<<1|1]);
}
void pushdown(int rt){
sum[rt<<1] = min(sum[rt<<1],tree[rt]);
sum[rt<<1|1] = min(sum[rt<<1|1],tree[rt]);
tree[rt<<1] = min(tree[rt<<1],tree[rt]);
tree[rt<<1|1] = min(tree[rt<<1|1],tree[rt]);
tree[rt] = inf;
}
void build(int l,int r,int rt){
tree[rt] = inf;
if(l == r){
sum[rt] = inf;
return;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
}
void update(int l,int r,int rt,int v){
if(L <= l && R >= r){
sum[rt] = min(sum[rt],v);
tree[rt] = min(tree[rt], v);
return;
}
pushdown(rt);
int m = (l + r) >> 1;
if(L <= m)update(lson,v);
if(m < R)update(rson,v);
pushup(rt);
}
void query(int l,int r,int rt){
if(l == r){
w[l] = sum[rt];
return;
};
int m = (l + r) >> 1;
pushdown(rt);
if(L <= m)query(lson);
if(m < R)query(rson);
pushup(rt);
}
int main(){
cin >> n >> k >> m;
for(int i = 1; i <= n; i++){
scanf("%d",&c[i]);
ans += c[i];
}
build(1,n,1);
for(int i = 1; i <= m; i++){
int u,w,v;
scanf("%d%d%d",&L,&R,&v);
update(1,n,1,v);
}
L = 1,R = n;
query(1,n,1);

for(int i = 1; i <= n; i++){
    for(int j = k; j >= w[i]; j--){
        dp[j] = max(dp[j],dp[j - w[i]] - c[i]);
    }
}
cout << ans + dp[k] << endl;
return 0;

}

Guess you like

Origin www.cnblogs.com/Emcikem/p/12127987.html