#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#define MAX 100001
#define L(x) (x<<1)
#define R(x) (x<<1 | 1)
using namespace std;
int sum=0;
struct node
{
int l;
int r;
int val;
}a[MAX*3];
void build(int t, int l, int r)
{
int mid=l+(r-l)/2;
a[t].l=l;
a[t].r=r;
a[t].val=1;
if(l==r)return ;
build(L(t),l,mid);
build(R(t),mid+1,r);
}
void set(int t,int l,int r,int v)
{
if(a[t].l>=l&&a[t].r<=r)
{
a[t].val=v;
return;
}
int mid=a[t].l+(a[t].r-a[t].l)/2;
if(a[t].val>0)
{
a[L(t)].val=a[t].val;
a[R(t)].val=a[t].val;
a[t].val=-1;
}
if(l<=mid)
{
set(L(t),l,r,v);
}
if(mid<r)
{
set(R(t),l,r,v);
}
}
void query(int t,int l,int r)
{
if(a[t].val>0)
{
sum+=a[t].val*(min(r,a[t].r)-max(l,a[t].l)+1);
}
else
{
int m=a[t].l+(a[t].r-a[t].l)/2;
if(l<=m)query(L(t),l,r);
if(r>m)query(R(t),l,r);
}
}
int main()
{
int t,n,m,i,j,k;
int l,r,v;
scanf("%d",&t);
for(k=1;k<=t;k++)
{
scanf("%d",&n);
build(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&l,&r,&v);
set(1,l,r,v);
}
sum=0;
query(1,1,n);
printf("Case %d: The total value of the hook is %d.\n",k,sum);
}
return 0;
}hdu1698
最新推荐文章于 2022-12-12 21:12:45 发布
本文介绍了一种使用段式更新和查询的技术实现方法,通过预先构建数据结构并进行更新操作,最后执行查询得到总价值。该方法适用于需要频繁更新区间内元素值并查询区间总和的应用场景。
412

被折叠的 条评论
为什么被折叠?



