hdu4107 线段树水题
2014-10-29 23:00
183 查看
这道题确定够坑的 太卡时间了 我只想说G++超时 C++刚刚过
每个节点记录最大伤害 最小伤害 子节点应该增加的伤害 注意更新时停止的条件
每个节点记录最大伤害 最小伤害 子节点应该增加的伤害 注意更新时停止的条件
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define LL(x) (x<<1) #define RR(x) ((x<<1)|1) struct node { int large,few,add; }num[4*200000]; int k,flash; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } int make(int L,int R,int mark) { int mid=(L+R)/2; num[mark].large=num[mark].few=num[mark].add=0; if(L==R) return 0; make(L,mid,LL(mark)); make(mid+1,R,RR(mark)); return 0; } int deal(int a) { num[LL(a)].few+=num[a].add; num[LL(a)].large+=num[a].add; num[RR(a)].large+=num[a].add; num[RR(a)].few+=num[a].add; num[LL(a)].add+=num[a].add; num[RR(a)].add+=num[a].add; num[a].add=0; return 0; } int update(int L,int R,int left,int right,int mark,int x) { int mid=(L+R)/2; if(L==left&&R==right) { if(num[mark].few>=k) { num[mark].few+=2*x; num[mark].large+=2*x; num[mark].add+=2*x; return 0; } else if(num[mark].large<k) { num[mark].few+=x; num[mark].large+=x; num[mark].add+=x; return 0; } deal(mark); update(L,mid,L,mid,LL(mark),x); update(mid+1,R,mid+1,R,RR(mark),x); num[mark].large=max(num[LL(mark)].large,num[RR(mark)].large); num[mark].few=min(num[LL(mark)].few,num[RR(mark)].few); return 0; } if(num[mark].add>0) { deal(mark); } if(right<=mid) { update(L,mid,left,right,LL(mark),x); } else if(left>mid) { update(mid+1,R,left,right,RR(mark),x); } else { update(L,mid,left,mid,LL(mark),x); update(mid+1,R,mid+1,right,RR(mark),x); } num[mark].large=max(num[LL(mark)].large,num[RR(mark)].large); num[mark].few=min(num[LL(mark)].few,num[RR(mark)].few); return 0; } int print(int L,int R,int mark) { int mid=(L+R)/2; if(L==R) { if(flash!=0) printf(" "); flash++; printf("%d",num[mark].large); return 0; } if(num[mark].add>0) { deal(mark); } print(L,mid,LL(mark)); print(mid+1,R,RR(mark)); return 0; } int main() { int i,j,n,m,a,b,c; while(~scanf("%d%d%d",&n,&m,&k)) { //memset(num,0,sizeof(num)); make(1,n,1); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); update(1,n,a,b,1,c); } flash=0; print(1,n,1); printf("\n"); } return 0; }
相关文章推荐
- POJ 2777 线段树水题
- 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题
- 【hdu1166】敌兵布阵——线段树水题
- 线段树水题
- CodeForces 339D Xenia and Bit Operations (线段树水题)
- [ACM_数据结构] Color the ball [线段树水题][数组开大]
- 计蒜客 管家的忠诚(二) 线段树(水题续)
- hdu - 1394 Minimum Inversion Number(线段树水题)
- hdu1166线段树水题
- 玲珑杯 1164 - 战舰萝莉 线段树水题
- 【UVA】11525-Permutation(线段树水题)
- HDU 5443 The Water Problem(线段树水题)
- CDOJ_1591_An easy problem A(线段树水题)
- POJ 3264 Balanced Lineup(最大最小差值 线段树水题)
- hdu1166线段树水题
- POJ 3264 Balanced Lineup(线段树水题)
- poj3264 线段树水题
- HDU 2795 线段树 水题
- 线段树水题
- 计蒜客 管家的忠诚(线段树水题)