标签:rom mis pre pac out others nal problem after
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 34542 Accepted Submission(s): 16868
题目大意:对于每组数据,给定钩子段数n,默认每段长度开始为1,接着q次变换,每次变换将x~y的钩子长度变为z。求最后钩子总长度。
解题思路:就是线段树,区间的变换变成了区间的覆盖,最后输出总长度也就是sum[1]即可。理解后也就是模板题
#include<cstdio> #include<algorithm> using namespace std; const int N=100005; const int maxn=4*N; int sum[maxn],lazy[maxn]; int n,x,y,z; void pushup(int num) { sum[num] = sum[num*2]+sum[num*2+1]; } void pushdown(int num,int l) { if(lazy[num]) { //lazy、sum对应的值均是直接覆盖 lazy[num*2] = lazy[num]; lazy[num*2+1] = lazy[num]; sum[num*2] = lazy[num]*(l-l/2); sum[num*2+1] = lazy[num]*(l/2); lazy[num] = 0; } } void build(int num,int l,int r) { lazy[num] = 0; sum[num] = 1;//默认每段为1 if(l==r) { return ; } int mid=(l+r)/2; build(num*2,l,mid); build(num*2+1,mid+1,r); pushup(num); } void update(int num,int l,int r) { if(x<=l&&y>=r) { //lazy、sum对应的值均是直接覆盖 lazy[num] = z; sum[num] = z*(r-l+1); return ; } pushdown(num,r-l+1); int mid=(l+r)/2; if(x<=mid) update(num*2,l,mid); if(y>mid) update(num*2+1,mid+1,r); pushup(num); } int query(int num,int l,int r) { if(x<=l&&y>=r) { return sum[num]; } pushdown(num,r-l+1); int mid=(l+r)/2,ans=0; if(mid>=x) ans += query(num*2,l,mid); if(mid<y) ans += query(num*2,mid+1,r); return ans; } int main() { int T; int Case=1; scanf("%d",&T); while(T--) { scanf("%d",&n); int m; build(1,1,n); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d %d %d",&x,&y,&z); update(1,1,n); } //x=1;y=n; //int ans = query(1,1,n); printf("Case %d: The total value of the hook is %d.\n",Case++,sum[1]); } }
HDU-1698 Just a Hook (线段树、段变换(覆盖))
标签:rom mis pre pac out others nal problem after
原文地址:http://www.cnblogs.com/WWkkk/p/7366872.html