对应HDU题目:点击打开链接
Time Limit: 2000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
1 10 2 1 5 2 5 9 3
Sample Output
Case 1: The total value of the hook is 24.
Source
题意:Q个询问,每个询问(x,y,z)表示x~y的数变成z,求所有询问后1~n的总和
思路:线段树区间更新模板题,就是使用结构体跟不使用结构体要注意下~没什么可说。。。
#include<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<iostream> #define ms(x,y) memset(x,y,sizeof(x)) const int MAXN=100000+10; const int INF=1<<30; using namespace std; int sum[4*MAXN]; int add[4*MAXN]; int res; void down(int rt, int len) { if(add[rt]) { int l=rt<<1, r=rt<<1|1, num=add[rt]; add[l]=num; add[r]=num; sum[l]=num*(len-(len>>1)); sum[r]=num*(len>>1); add[rt]=0; } } void buildtree(int rt, int left, int right) { if(left==right){ sum[rt]=1; return; } int mid=(left+right)>>1; buildtree(rt<<1, left, mid); buildtree(rt<<1|1, mid+1, right); sum[rt]=sum[rt<<1] + sum[rt<<1|1]; } void updata(int rt, int left, int right, int x, int y, int z) { if(x==left && right==y){ add[rt]=z; sum[rt]=z*(right-left+1); return; } down(rt, right-left+1); int mid=(left+right)>>1; if(mid>=y) updata(rt<<1, left, mid, x, y, z); else if(mid<x) updata(rt<<1|1, mid+1, right, x, y, z); else{ updata(rt<<1, left, mid, x, mid, z); updata(rt<<1|1, mid+1, right, mid+1, y, z); } sum[rt]=sum[rt<<1] + sum[rt<<1|1]; } int main() { #if 0 freopen("in.txt","r",stdin); #endif int T,w=0; scanf("%d", &T); while(T--) { ms(add,0); res=0; int n,q; scanf("%d%d", &n,&q); buildtree(1,1,n); for(int i=0; i<q; i++){ int x,y,z; scanf("%d%d%d", &x,&y,&z); updata(1,1,n,x,y,z); } printf("Case %d: The total value of the hook is %d.\n", ++w,sum[1]); } return 0; }