其中的標誌s用的很妙,非常精髓,標記是否是純色,單色,是否往下遞迴,計算單色資料
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=2000000;
int n,m,a[MAXN+5],ans;
struct tree
{
int l,r;
int s;
}trees[MAXN*2];
int max(int k,int l)
{
return k>l?k:l;
}
void buildtree(int rs,int l,int r)
{
//printf("%d %d %d\n",rs,l,r);
trees[rs].l=l;
trees[rs].r=r;
trees[rs].s=1;
if(r==l)
return;
int mid=(l+r)/2;
buildtree(rs*2,l,mid);
buildtree(rs*2+1,mid+1,r);
}
void update(int rs,int l,int r,int u)
{
if(trees[rs].l>r||trees[rs].r<l)
return ;
//printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r);
if(trees[rs].l>=l&&trees[rs].r<=r)
{
trees[rs].s=u;
return ;
}
if(trees[rs].s!=-1)
{
trees[2*rs].s=trees[rs].s;
trees[2*rs+1].s=trees[rs].s;
trees[rs].s=-1;
}
update(rs*2,l,r,u);
update(rs*2+1,l,r,u);
}
void querry(int rs)
{
if(trees[rs].s!=-1)
{
ans+=(trees[rs].r-trees[rs].l+1)*trees[rs].s;
return ;
}
if(trees[rs].l==trees[rs].r)
return ;
querry(2*rs);
querry(2*rs+1);
}
int main()
{
int i,ac,bc,t,p;
int c;
scanf("%d",&t);
p=1;
while(t--)
{
scanf("%d%d",&n,&m);
buildtree(1,1,n);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&c,&ac,&bc);
update(1,c,ac,bc);
}
ans=0;
querry(1);
printf("Case %d: The total value of the hook is %d.\n",p++,ans);
}
return 0;
}