세그먼트 트리 + DP

포함

포함

오래 오래 LL 정의

LSON의 L, m, RT 정의 << 1 // 아들 남아

정의 rson의 m + 1, R, RT << 1 | 1 // 右 儿子

INF 0x3f3f3f3f을 정의

네임 스페이스를 사용하여 표준;
CONST INT maxn 1E5 + = 5;
INT N, m, 합계 [maxn << 2], 트리 [maxn << 2];
INT K;
INT C [maxn, DP [maxn];
INT ANS = 0;
[maxn] 승 int로;
INT R, L, C;
INT 읽기 () {//快速读入数字
INT A = 0, X = getchar가 숯 () 부울 F = 0;
반면 ((X <0 || x> '9') && X = '-'!) X = getchar가 ();
경우 (X == '-') X = getchar가 (), F = 1;
반면 (x> = 0 && X <= '9')은 = A + X - 48 * 10, X = getchar가 ();
? -a f를 반환 : A는;
}
공극 팔 굽혀 펴기 (INT RT) {
합 [RT] = 분 (합계 [RT << 1] 합계 [RT << 1 | 1]);
}
공극 푸시 (INT RT) {
합 [RT << 1] = 분 (합계 [RT << 1], 트리 [RT]);
합 [RT << 1 | 1] = 분 (합계 [RT << 1 | 1] 트리 [RT]);
트리 [RT << 1] = 분 (트리 [RT << 1], 트리 [RT]);
트리 [RT << 1 | 1] = 분 (트리 [RT << 1 | 1], 트리 [RT]);
트리 [RT] = INF;
}
공극 빌드 (INT의 L, R INT, INT의 RT) {
트리 [RT] = INF;
경우 (L == R) {
합 [RT] = INF;
반환;
}
INT m = (L +의 연구) >> 1;
빌드 (LSON);
빌드 (rson);
(RT) 팔 굽혀 펴기;
}
공극 업데이트 (INT의 L, R INT, INT RT, INT의 V) {
경우 (L <= 1 && R> = R) {
합 [RT] = 분 (합계 [RT], V);
트리 [RT] = 분 (트리 [RT], V);
반환;
}
푸시 (RT);
m = INT (리터의 R +) >> 1;
(L <= m) 만약 업데이트 (LSON, V);
경우 (m <R) 업데이트 (rson, V);
(RT) 팔 굽혀 펴기;
}
공극 쿼리 (INT의 L, R INT, INT의 RT) {
경우 (L == R) {
[1] = w 합계 [RT];
반환;
};
m = INT (리터의 R +) >> 1;
푸시 (RT);
경우 (L <= m) 쿼리 (LSON);
경우 (m <R) 쿼리 (rson)를;
(RT) 팔 굽혀 펴기;
}
INT의 main () {
CIN N >> >> >> K m을;
위한 (INT 난 = 1; I <= N; I ++) {
는 scanf ( "%의 D ', C [I]);
ANS + C = [I];
}
빌드 (1 N, 1);
위한 (INT 난 = 1; I <= m; I ++) {
INT을 U, V w;
scanf와 ( "% D % D % D ', L, R, V);
업데이트 (1 N, 1, V);
}
L = 1, R = N;
질의 (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;

}

추천

출처www.cnblogs.com/Emcikem/p/12127987.html