Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
很水的线段树。。。。直接更新区间lazy标记一下 输出的时候把lazy全部推到子节点,直接统计一下就好了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef long long int LL; const LL maxn=204000; LL r[maxn*2],md[maxn*2],val[maxn*2],n,m,vt,zhi[maxn*2],Hash[maxn*2],high[maxn]; bool cmpR(int a,int b) { return val[a]<val[b]; } int Lisan(int n) { for(int i=0;i<n;i++) r[i]=i; sort(r,r+n,cmpR); md[0]=val[r[0]]; val[r[0]]=m=0; for(int i=1;i<n;i++) { if(md[m]!=val[r[i]]) md[++m]=val[r[i]]; val[r[i]]=m; } return m; } LL tree[maxn<<2],cover[maxn<<2]; void push_down(int l,int r,int rt) { if(cover[rt]) { tree[rt<<1]=max(tree[rt<<1],tree[rt]); tree[rt<<1|1]=max(tree[rt<<1|1],tree[rt]); cover[rt<<1]=cover[rt<<1|1]=1; cover[rt]=0; } } void update(int L,int R,LL c,int l,int r,int rt) { if(L<=l&&r<=R) { tree[rt]=max(tree[rt],c); cover[rt]=1; return ; } push_down(l,r,rt); int m=(l+r)/2; if(L<=m) update(L,R,c,lson); if(R>m) update(L,R,c,rson); } LL ans; void over_tree(int l,int r,int rt) { push_down(l,r,rt); if(l==r) { ans+=(Hash[r+1]-Hash[l])*tree[rt]; return ; } int m=(l+r)/2; over_tree(lson); over_tree(rson); } int main() { while(scanf("%d",&n)!=EOF) { vt=0; memset(tree,0,sizeof(tree)); memset(cover,0,sizeof(cover)); for(int i=0;i<n;i++) { LL a,b,c; scanf("%I64d%I64d%I64d",&a,&b,&c); val[vt]=zhi[vt]=a; vt++; val[vt]=zhi[vt]=b; vt++; high[i]=c; } int mx=Lisan(vt); for(int i=0;i<vt;i++) { Hash[val[i]]=zhi[i]; } for(int i=0;i<n;i++) { update(val[i*2],val[i*2+1]-1,high[i],0,mx,1); } ans=0; over_tree(0,mx,1); printf("%I64d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator