ZOJ Toy Blocks
2012-10-07 03:00
344 查看
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef long long lld; const int maxn=100005; struct Node{ lld x; lld h; bool operator <(const Node &t)const { return x<t.x; } }p[maxn]; lld R[maxn]; lld L[maxn]; lld l[maxn]; int dp[maxn]; int Min(int a,int b){ if(a==-1)return b; return a<b?a:b; } int LL(int x){ return x<<1;} int RR(int x){ return (x<<1)|1 ;} struct Point{ int l,r; int val; int flag; }tree[maxn<<2]; void build(int l,int r,int k){ tree[k].l=l; tree[k].r=r; tree[k].val=maxn; tree[k].flag=-1; if(l==r)return ; int mid=(l+r)>>1; build(l,mid,LL(k)); build(mid+1,r,RR(k)); } void push_down(int k){ if(tree[k].flag!=-1){ int l=LL(k);int r=RR(k); tree[l].val=Min(tree[l].val,tree[k].flag); tree[r].val=Min(tree[r].val,tree[k].flag); tree[l].flag=Min(tree[l].flag,tree[k].flag); tree[r].flag=Min(tree[r].flag,tree[k].flag); tree[k].flag=-1; } } void push_up(int k){ int l=LL(k);int r=RR(k); tree[k].val=Min(tree[r].val,tree[l].val); } void update(int l,int r,int k,int val){ if(l<=tree[k].l && r>=tree[k].r){ tree[k].val=Min(tree[k].val,val); tree[k].flag=Min(tree[k].flag,val); return ; } push_down(k); int mid=(tree[k].l+tree[k].r)>>1; if(l<=mid) update(l,r,LL(k),val); if(mid<r) update(l,r,RR(k),val); push_up(k); } int Gao(int l,int r,int k){ if(l<=tree[k].l && r>=tree[k].r){ return tree[k].val; } push_down(k); int mid=(tree[k].l+tree[k].r)>>1; int ret=maxn; if(l<=mid) ret=Min(ret,Gao(l,r,LL(k))); if(mid<r) ret=Min(ret,Gao(l,r,RR(k))); return ret; } int query(int l,int k){ if(l==tree[k].l && l==tree[k].r){ return tree[k].val; } push_down(k); int mid=(tree[k].l+tree[k].r)>>1; if(l<=mid)return query(l,LL(k)); else return query(l,RR(k)); } int main(){ int n; int i,j,k; int id; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].h); sort(p+1,p+n+1); //for(i=1;i<=n;i++) // printf("ans==%I64d %I64d\n",p[i].x,p[i].h); L[0]=R[0]=0; L[1]=1; for(i=2;i<=n;i++){ if(p[i].x-p[i-1].x<=p[i].h){ L[i]=L[i-1]; id=L[i-1]; while( id-1>0 &&p[i].h>=p[i].x-p[id-1].x) id=L[id-1]; L[i]=id; }else{ L[i]=i; } } for(i=0;i<=n;i++){ dp[i]=maxn; } R =n; for(i=n-1;i>0;i--){ if(p[i+1].x-p[i].x<=p[i].h ){ R[i]=R[i+1]; id=R[i+1]; while( id+1<=n &&p[i].h>=p[id+1].x-p[i].x) id=R[id+1]; R[i]=id; }else{ R[i]=i; } } // for(i=1;i<=n;i++) // printf("i==%d L==%I64d R==%I64d\n",i,L[i],R[i]); build(0,n,1); update(0,0,1,0); dp[0]=0; for(i=1;i<=n;i++){ int tmp=dp[i-1]+1; tmp=Min(tmp,Gao(L[i]-1,i,1)+1); update(i,i,1,tmp); update(i,R[i],1,dp[i-1]+1); dp[i]=query(i,1); //printf("dp==%d %d %d %I64d %I64d\n",i,dp[i],tmp,L[i],R[i]); } printf("%d\n",dp ); } return 0; } /* 8 4 4 4 2 5 0 6 9 6 10 16 5 41 55 1000 0 8 4 4 5 0 41 55 1000 0 4 2 6 9 6 10 16 5 9 70 0 80 1 95 1000 96 0 97 1 100 100 1000 1 1002 1 1004 1 12 5 9 5 65 5 9 56 0 545 1 22222222 2 99 9 4555454 454512 121 5455 455 55212 45451 214589 12152 1542 6 1 1 3 5 7 5 11 3 14 5 122 110 6 1 1 2 2 3 1 5 1 6 1 8 3 */
相关文章推荐
- ZOJ 3650 Toy Blocks(线段树+DP)
- ZOJ 3650 Toy Blocks(DP + 线段树优化转移)
- ZOJ 3650 Toy Blocks(DP + 线段树优化转移)
- POJ 2363 Blocks (ZOJ 1910) 数学
- POJ 2363 Blocks (ZOJ 1910) 数学
- ZOJ Consecutive Blocks(左右指针移动)
- zoj 1910 || poj 2363 Blocks (感谢党姐做的数论水题。。。)
- ZOJ 3678 The Toy of Flandre Scarlet
- zoj 1910 Blocks
- zoj 2678 The Toy of Flandre Scarlet
- ZOJ 1915 Above Average
- ZOJ - 3762 Pan's Labyrinth (点到直线距离模板)
- ZOJ Problem Set - 3643 Keep Deleting
- The Blocks Problem
- ZOJ1101 搜索
- [ACM_水题] ZOJ 3712 [Hard to Play 300 100 50 最大最小]
- zoj - 2928 - Mathematical contest in modeling(爬山)
- bzoj2086【Poi2010】Blocks
- zoj——3623(dp)
- zoj 3706 Break Standard Weight