关键在于延迟标记
hdu 1698
给定区间了l, r,将区间内的每一个数都设置为v;
// 1698
#include <cstdio>
const int maxn = 100005;
int node[maxn<<2], col[maxn<<2];
int t,n, q, ca = 1;
int ql, qr, v;
void construct(int o, int l, int r)
{
col[o] = 0;
if(l == r)
{
node[o] = 1;
return;
}
int m = (l+r) >> 1;
construct(2*o, l, m);
construct(2*o+1, m+1, r);
node[o] = node[2*o] + node[2*o+1];
}
void pushdown(int o, int l, int r)
{
if(col[o])
{
col[2*o] = col[2*o+1] = col[o];
int m = (l+r) >> 1;
node[2*o] = col[o] * (m-l+1);
node[2*o+1] = col[o] * (r-m);
col[o] = 0;
}
}
void update(int o, int l, int r)
{
if(ql<=l && qr>=r)
{
col[o] = v;
node[o] = (r-l+1) * v;
return;
}
pushdown(o, l, r);
int m = (l+r) >> 1;
if(ql <= m)
update(2*o, l, m);
if(qr > m)
update(2*o+1, m+1, r);
node[o] = node[2*o] + node[2*o+1];
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
construct(1, 1, n);
scanf("%d", &q);
while(q--)
{
scanf("%d %d %d", &ql, &qr, &v);
update(1, 1, n);
}
printf("Case %d: The total value of the hook is %d.\n", ca++, node[1]);
}
return 0;
}
poj 3468
给定区间l, r, 将区间内的每一个数加上v;
// 1698
#include <cstdio>
const int maxn = 100005;
int node[maxn<<2], col[maxn<<2];
int t,n, q, ca = 1;
int ql, qr, v;
void construct(int o, int l, int r)
{
col[o] = 0;
if(l == r)
{
node[o] = 1;
return;
}
int m = (l+r) >> 1;
construct(2*o, l, m);
construct(2*o+1, m+1, r);
node[o] = node[2*o] + node[2*o+1];
}
void pushdown(int o, int l, int r)
{
if(col[o])
{
col[2*o] = col[2*o+1] = col[o];
int m = (l+r) >> 1;
node[2*o] = col[o] * (m-l+1);
node[2*o+1] = col[o] * (r-m);
col[o] = 0;
}
}
void update(int o, int l, int r)
{
if(ql<=l && qr>=r)
{
col[o] = v;
node[o] = (r-l+1) * v;
return;
}
pushdown(o, l, r);
int m = (l+r) >> 1;
if(ql <= m)
update(2*o, l, m);
if(qr > m)
update(2*o+1, m+1, r);
node[o] = node[2*o] + node[2*o+1];
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
construct(1, 1, n);
scanf("%d", &q);
while(q--)
{
scanf("%d %d %d", &ql, &qr, &v);
update(1, 1, n);
}
printf("Case %d: The total value of the hook is %d.\n", ca++, node[1]);
}
return 0;
}