hdu 1698Just a Hook(线段树区间修改)
2016-07-24 16:33
323 查看
题目链接
题意:
题目意思是说讲整个区间的每个元素值提前全部置为1 然后给出三个数a b c 表示将区间a到b的值都置为c,然后求经过几次操作后整个区间总和。
题意:
题目意思是说讲整个区间的每个元素值提前全部置为1 然后给出三个数a b c 表示将区间a到b的值都置为c,然后求经过几次操作后整个区间总和。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN=100010; struct Node { int l,r; int lazy,tag; int sum; }segTree[MAXN*4]; void Build(int i,int l,int r) //建树 { segTree[i].l=l; segTree[i].r=r; segTree[i].lazy=0; segTree[i].tag=0; if(l==r) { segTree[i].sum=1; //普通线段树改成元素值即可 return; } int mid=(l+r)>>1; Build(i<<1,l,mid); Build((i<<1)|1,mid+1,r); segTree[i].sum=segTree[i<<1].sum+segTree[(i<<1)|1].sum; } void update(int i,int l,int r,int v) { if(segTree[i].l==l&&segTree[i].r==r) //成段更新 { segTree[i].lazy=1; segTree[i].tag=v; segTree[i].sum=(r-l+1)*v; return; } int mid=(segTree[i].l+segTree[i].r)>>1; if(segTree[i].lazy==1) { segTree[i].lazy=0; update(i<<1,segTree[i].l,mid,segTree[i].tag); update((i<<1)|1,mid+1,segTree[i].r,segTree[i].tag); segTree[i].tag=0; } if(r<=mid) update(i<<1,l,r,v); else if(l>mid)update((i<<1)|1,l,r,v); else { update(i<<1,l,mid,v); update((i<<1)|1,mid+1,r,v); } segTree[i].sum=segTree[i<<1].sum+segTree[(i<<1)|1].sum; } int query(int i,int l,int r) //查询过程 { if(segTree[i].lazy) return segTree[i].tag*(r-l+1); if(segTree[i].l==l&&segTree[i].r==r) return segTree[i].sum; int m=(segTree[i].l+segTree[i].r)/2; if(r<=m) return query(i*2,l,r); else if(l>m) return query(i*2+1,l,r); else return query(i*2,l,m)+query(i*2+1,m+1,r); } int main() { int x,y,z; int n; int m; int T; scanf("%d",&T); int iCase=0; while(T--) { iCase++; scanf("%d%d",&n,&m); Build(1,1,n); while(m--) { scanf("%d%d%d",&x,&y,&z); update(1,x,y,z); } printf("Case %d: The total value of the hook is %d.\n",iCase,query(1,1,n)); } return 0; }
相关文章推荐
- PAT (Top Level) Practise 1008 Airline Routes (35) (tarjan算法求强联通分量)【四星级】
- HDU 1856 More is better 并查集
- bzoj1014火星人(字符串hash+splay)
- cmd光标移动
- NavigableSet接口源码解析
- 90. Subsets II
- 如何用PS将gif图背景变透明
- linux命令link汇总
- HDU1213 How Many Tables 并查集
- redis集群的合纵和连横
- 3.8 编写一个程序打印如图 3.1 所示的 n 阶杨辉三角形,其中 n 由用户输入,该值不 能大于 13。
- yum方式安装ffmpeg步骤
- HDU 1233 还是畅通工程 最小生成树 Prim模板的应用
- Java异常处理-----程序中的异常处理.启蒙
- Java异常处理-----程序中的异常处理.启蒙
- Codeforces 701E Connecting Universities 贪心
- 快速排序算法的时间复杂度分析[详解Master method]
- [HDU 5739] Fantasia (点双联通分量 + Block Forest Data Structure)
- Xcode项目工程文件存放的地方
- 显示在文本框中输入的信息