三个区间覆盖操作的线段树题,蛮简单的,貌似我多写了一个query,不过写了就算了吧
代码:
#include <bits/stdc++.h>
#define lson o<<1
#define rson o<<1|1
using namespace std;
const int maxn=1e5+5;
int n;
struct p
{
int sum;
int lazy;
}a[maxn<<4];
void update(int o, int l, int r, int ll, int rr, int x)
{
//printf("%d %d\n", l, r);
if(ll<=l && r<=rr)
{
a[o].sum=(r-l+1)*x;
a[o].lazy=x;
// printf("%d %d %d\n", l, r, a[o].sum);
return;
}
int mid=(l+r)/2;
if(a[o].lazy>0 && (r-l)>=1)
{
a[lson].sum=(mid-l+1)*a[o].lazy;
a[lson].lazy=a[o].lazy;
a[rson].sum=(r-mid)*a[o].lazy;
a[rson].lazy=a[o].lazy;
a[o].lazy=0;
}
if(ll<=mid)update(lson, l, mid, ll, rr, x);
if(mid<rr)update(rson, mid+1, r, ll, rr, x);
a[o].sum=a[lson].sum+a[rson].sum;
}
int query(int o, int l, int r, int ll, int rr)
{
if(ll<=l && r<=rr)
{
return a[o].sum;
}
int mid=(l+r)/2;
int res=0;
if(ll<=mid)res+=query(lson, l, mid, ll, rr);
if(rr>mid)res+=query(rson, mid+1, r, ll, rr);
return res;
}
int main()
{
int x, y, z, e=1, t;
cin>>t;
while(t--)
{
int q;
scanf("%d%d", &n, &q);
for(int i=0; i<=n; i++)a[i].sum=a[i].lazy=0;
update(1, 1, n, 1, n, 1);
while(q--)
{
scanf("%d%d%d", &x, &y, &z);
update(1, 1, n, x, y, z);
}
printf("Case %d: The total value of the hook is %d.\n", e++, query(1, 1, n, 1, n));
}
}