1. 程式人生 > >HDU 1698 Just a Hook 題解&程式碼

HDU 1698 Just a Hook 題解&程式碼

題目要求是對於一個初始值均為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; }