#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 ...