HDU 1698 Just a Hook 題解&程式碼
阿新 • • 發佈:2018-12-30
題目要求是對於一個初始值均為1的區間進行區間修改,修改目標為:[a,b]區間內的值被修改為c
對於多組資料的每組資料輸出q次修改後的全區間和
基本線段樹了…只有兩個元素需要維護:sum和add,sum表示該點的區間元素和,add表示該點代表的區間當前被賦值的大小
坑點在於多組資料= =要不是某人前(jie)車(wo)之(dai)鑑(ma)我二十分鐘肯定調不過,儘管如此也WA了四次= =總之,時刻記住這是多組資料就很簡單了
#include<iostream>
#include<stdio.h>
using namespace std;
int T,t,n,q,a,b,c;
int ans,x,add[800020],sum[800020];
void pushdown(int o,int l,int r)
{
if(!add[o])return;
sum[o]=add[o]*(r-l+1);
int mid=(l+r)/2;
if(l!=r)
{
add[o<<1]=add[o];
add[(o<<1)+1]=add[o];
sum[o<<1]=add[o]*(mid-l+1);
sum[(o<<1)+1]=add[o]*(r-mid+1 );
}
add[o]=0;
}
void maintain(int o,int l,int r)
{
if(l!=r)
sum[o]=sum[o<<1]+sum[(o<<1)+1];
else if(add[o])sum[o]=add[o],add[o]=0;
}
int build(int o,int l,int r)
{
add[o]=0;
if(l==r)return sum[o]=1;
int mid=(l+r)/2;
return sum[o]=build(o<<1,l,mid)+build((o<<1 )+1,mid+1,r);
}
void change(int o,int l,int r)
{
pushdown(o,l,r);
if(l>=a && r<=b)
{
add[o]=c;
pushdown(o,l,r);
return;
}
if(r<a || l>b)return;
int mid=(l+r)/2;
change(o<<1,l,mid);
change((o<<1)+1,mid+1,r);
maintain(o,l,r);
return;
}
int main(void)
{
scanf("%d",&T);
while(++t)
{
if(t>T)break;
scanf("%d",&n);
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&a,&b,&c);
change(1,1,n);
}
printf("Case %d: The total value of the hook is %d.\n",t,sum[1]);
}
return 0;
}