线段树成段更新第一题。
主要就是lazy操作,只有这需要查询的时候才去更新,节省很多时间。
#include <stdio.h>
#include <iostream>
using namespace std;
#define lson rt << 1
#define rson rt << 1 | 1
int T, N, Q, maxn[100005 << 2];
pair<int, int> p, lazy[100005 << 2];
void build(int l, int r, int rt)
{
if(l == r)
{
maxn[rt] = 1;
return ;
}
int mid = (l + r) >> 1;
build(l, mid, lson);
build(mid + 1, r, rson);
maxn[rt] = maxn[lson] + maxn[rson];
}
void update(int l, int r, int rt, int L, int R, pair<int, int> k)
{
if(l >= L && R >= r)
{
lazy[rt] = k;
return ;
}
int mid = (l + r) >> 1;
if(L <= mid) update(l, mid, lson, L, R, k);
if(R > mid) update(mid + 1, r, rson, L, R, k);
}
void query(int l, int r, int rt, pair<int, int> k)
{
if(k.first < lazy[rt].first)
k = lazy[rt];
if(l == r)
{
if(k.first != 0)
maxn[rt] = k.second;
return ;
}
int mid = (l + r) >> 1;
query(l, mid, lson, k);
query(mid + 1, r, rson, k);
maxn[rt] = maxn[lson] + maxn[rson];
}
int main()
{
scanf("%d", &T);
for(int i = 1; i <= T; i++)
{
scanf("%d", &N);
build(1, N, 1);
scanf("%d", &Q);
for(int j = 1; j < (100005 << 2); j++)
{
lazy[j].first = 0;
lazy[j].second = 0;
}
for(int j = 0; j < Q; j++)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
p.first = j + 1;
p.second = z;
update(1, N, 1, x, y, p);
}
p.first = 0;
p.second = 0;
query(1, N, 1, p);
printf("Case %d: The total value of the hook is %d.\n", maxn[1]);
}
return 0;
}