hdu1698 區間改變 lazy線段樹

2021-08-31 07:39:02 字數 1185 閱讀 5411

#include using namespace std;

const int maxn=100010;

struct nodetree[maxn*4];

int a[maxn*4];

void pushdown(int id,int date)//只往下push一層

tree[id<<1].sum=date*(tree[id<<1].r-tree[id<<1].l+1);

a[id<<1]=date;

tree[id<<1|1].sum=date*(tree[id<<1|1].r-tree[id<<1|1].l+1);

a[id<<1|1]=date;

tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;

a[id]=0;

} void build(int id,int l,int r)

int mod=(l+r)>>1;

build(id<<1,l,mod);

build(id<<1|1,mod+1,r);

tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;

}void change(int id,int l,int r,int date)//l r是要修改的區間

if(0!=a[id])//如果這個區間已經有別的數了,將這個數往下push一層,不會影響當前數對該層的改變

pushdown(id,a[id]);

// pushdown(id,tree[id].sum/(tree[id].r-tree[id].l+1)); 可以將pushdown換掉

int mod=(tree[id].l+tree[id].r)>>1;

if(mod>=r) change(id<<1,l,r,date);

else if(mod+1<=l) change(1+(id<<1),l,r,date);

else

tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;

}int main()

printf("case %d: the total value of the hook is %d.\n",cnt++,tree[1].sum);

} return 0;

}

hdu 1698 區間更新

基礎題 初學 include include using namespace std define lson l m rt 1 define rson m 1 r rt 1 1 const int maxn 101000 int h w n int col maxn 2 標記是否當前節點梗係 int...

hdu1698 區間更新

初寫線段樹的時候,印象最深的一道,有乙個pushdown的操作,使我的tle變成了ac 題意輸入t,然後t組資料 輸入n,m,n代表n個點上價值全是1的繩子,m代表m次操作 m行l,r,val 就是區間l,r變成val 求最後繩子總共價值 思路線段樹,懶人標記 include include inc...

線段樹 HDU 1698 區間set,區間查詢

就是ba區間的每乙個值都變成某個數。poj 3468 區間add,區間查詢 include include includeusing namespace std 每當有add加到i節點上,不會去更新i節點的sum.也就是說如果要查詢區間 1,n 的sum值,既要考慮sum i 的值,也要考慮add ...