E - Just a Hook HDU - 1698 - 선분 트 리 구간 업데이트 + lazy 태그

Think: 1 지식 포인트: 선분 트 리 구간 업데이트 + lazy 태그 2 문제: n 개의 초기 화 점 권 이 1 인 점 을 바탕 으로 구간 업 데 이 트 를 진행 하여 최종 상태 n 개의 점 권 과 3 반성: 현재 문제 lazy 태그 할당 업데이트
제목 링크
다음은 Wrong Answer 코드 - lazy 태그 업데이트 오류 입 니 다.
#include 
#include 
#include 

using namespace std;

const int N = 101400;

struct Node{
    int sum;
}node[N<<2];

int lazy[N<<2];

void Build(int l, int r, int rt);
void Updata(int rt);
void down(int rt, int l, int r);
void up_v(int L, int R, int v, int l, int r, int rt);

int main(){
    int T, k = 1, n, m, L, R, v;
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        Build(1, n, 1);
        scanf("%d", &m);
        while(m--){
            scanf("%d %d %d", &L, &R, &v);
            up_v(L, R, v, 1, n, 1);
        }
        printf("Case %d: The total value of the hook is %d.
"
, k++, node[1].sum); } return 0; } void Build(int l, int r, int rt){ lazy[rt] = 0; if(l == r){ node[rt].sum = 1; return; } int mid = (l+r)/2; Build(l, mid, rt<<1); Build(mid+1, r, rt<<1|1); Updata(rt); } void Updata(int rt){ node[rt].sum = node[rt<<1].sum + node[rt<<1|1].sum; } void up_v(int L, int R, int v, int l, int r, int rt){ if(L <= l && r <= R){ node[rt].sum = v*(r-l+1); lazy[rt] = v; return; } down(rt, l, r); int mid = (l+r)/2; if(L <= mid) up_v(L, R, v, l, mid, rt<<1); if(R > mid) up_v(L, R, v, mid+1, r, rt<<1|1); Updata(rt); } void down(int rt, int l, int r){ if(lazy[rt]){ lazy[rt<<1] += lazy[rt]; lazy[rt<<1|1] += lazy[rt]; int mid = (l+r)/2; node[rt<<1].sum = lazy[rt]*(mid-l+1); node[rt<<1|1].sum = lazy[rt]*(r-mid); lazy[rt] = 0; } }

다음은 Accepted 코드 입 니 다.
#include 
#include 
#include 

using namespace std;

const int N = 101400;

struct Node{
    int sum;
}node[N<<2];

int lazy[N<<2];

void Build(int l, int r, int rt);
void Updata(int rt);
void down(int rt, int l, int r);
void up_v(int L, int R, int v, int l, int r, int rt);

int main(){
    int T, k = 1, n, m, L, R, v;
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        Build(1, n, 1);
        scanf("%d", &m);
        while(m--){
            scanf("%d %d %d", &L, &R, &v);
            up_v(L, R, v, 1, n, 1);
        }
        printf("Case %d: The total value of the hook is %d.
"
, k++, node[1].sum); } return 0; } void Build(int l, int r, int rt){ lazy[rt] = 0; if(l == r){ node[rt].sum = 1; return; } int mid = (l+r)/2; Build(l, mid, rt<<1); Build(mid+1, r, rt<<1|1); Updata(rt); } void Updata(int rt){ node[rt].sum = node[rt<<1].sum + node[rt<<1|1].sum; } void up_v(int L, int R, int v, int l, int r, int rt){ if(L <= l && r <= R){ node[rt].sum = v*(r-l+1); lazy[rt] = v; return; } down(rt, l, r); int mid = (l+r)/2; if(L <= mid) up_v(L, R, v, l, mid, rt<<1); if(R > mid) up_v(L, R, v, mid+1, r, rt<<1|1); Updata(rt); } void down(int rt, int l, int r){ if(lazy[rt]){ lazy[rt<<1] = lazy[rt];/*lazy */ lazy[rt<<1|1] = lazy[rt];/*lazy */ int mid = (l+r)/2; node[rt<<1].sum = lazy[rt]*(mid-l+1); node[rt<<1|1].sum = lazy[rt]*(r-mid); lazy[rt] = 0; } }

좋은 웹페이지 즐겨찾기