hdu 1698 Just a Hook(线段更新)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100000*3
struct STNode
{
int l,r,cover,kink; //记住cover为完全覆盖
};
STNode node[MAXN];
void build(int a,int b,int idx)
{
node[idx].l=a;
node[idx].r=b;
node[idx].cover=1;
node[idx].kink=1;
if(a==b) return;
int mid=(a+b)/2;
build(a,mid,idx*2);
build(mid+1,b,idx*2+1);
}
void update(int a,int b,int c,int idx)
{
if(a==node[idx].l && node[idx].r==b)
{
node[idx].cover=1;
node[idx].kink=c;
return;
}
if(node[idx].cover)
{
node[idx].cover=0;
node[idx*2].cover=node[idx*2+1].cover=1;
node[idx*2].kink=node[idx*2+1].kink=node[idx].kink;
}
if(b<=node[idx*2].r) update(a,b,c,idx*2);
else if(a>=node[idx*2+1].l) update(a,b,c,idx*2+1);
else
{
update(a,node[idx*2].r,c,idx*2);
update(node[idx*2+1].l,b,c,idx*2+1);
}
}
int query(int a,int b,int idx)
{
if(node[idx].cover)
{
return (node[idx].r-node[idx].l+1)*node[idx].kink;
}
if(b<=node[idx*2].r) return query(a,b,idx*2);
else if(a>=node[idx*2+1].l) return query(a,b,idx*2+1);
else return query(a,node[idx*2].r,idx*2)+query(node[idx*2+1].l,b,idx*2+1);
}
int main()
{
int T,cas,n,Q,i,j,k;
scanf("%d",&T);
for(cas=1; cas<=T; cas++)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&Q);
while(Q--)
{
scanf("%d %d %d",&i,&j,&k);
update(i,j,k,1);
}
printf("Case %d: The total value of the hook is %d.\n",cas,query(1,n,1));
}
return 0;
}
浙公网安备 33010602011771号