HDU 1698---线段树
线段树成段更新模板题。。
题意:
给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define maxn 100100 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int sum[maxn<<2],flag[maxn<<2]; 8 void Pushup(int rt) 9 { 10 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 11 } 12 void Pushdown(int rt,int num) 13 { 14 if(flag[rt]) 15 { 16 flag[rt<<1]=flag[rt<<1|1]=flag[rt]; 17 sum[rt<<1]=(num-(num>>1))*flag[rt]; 18 sum[rt<<1|1]=(num>>1)*flag[rt]; 19 flag[rt]=0; 20 } 21 } 22 void build(int l,int r,int rt) 23 { 24 if(l==r) 25 { 26 sum[rt]=1; 27 return; 28 } 29 flag[rt]=0; 30 int m=(l+r)>>1; 31 build(lson); 32 build(rson); 33 Pushup(rt); 34 } 35 void update(int L,int R,int add,int l,int r,int rt) 36 { 37 if(L<=l&&r<=R) 38 { 39 flag[rt]=add; 40 sum[rt]=(r-l+1)*add; 41 return; 42 } 43 Pushdown(rt,r-l+1); 44 int m=(l+r)>>1; 45 if(L<=m) update(L,R,add,lson); 46 if(R>m) update(L,R,add,rson); 47 Pushup(rt); 48 } 49 int main() 50 { 51 int t,cas=1,L,R,add,m,n; 52 while(~scanf("%d",&t)) 53 { 54 while(t--) 55 { 56 scanf("%d",&n); 57 build(1,n,1); 58 scanf("%d",&m); 59 while(m--) 60 { 61 scanf("%d %d %d",&L,&R,&add); 62 update(L,R,add,1,n,1); 63 } 64 printf("Case %d: The total value of the hook is %d.\n",cas++,sum[1]); 65 } 66 } 67 return 0; 68 }
posted on 2013-02-07 21:47 acoderworld 阅读(86) 评论(0) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步