Jzoj4845 寻找
生活随笔
收集整理的這篇文章主要介紹了
Jzoj4845 寻找
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“我有個愿望,我希望穿越一切找到你。”
這是個二維平面世界,平面上有n個特殊的果實,我從(0,0)點出發,希望得到盡量多的果實,但是出于某種特殊的原因,我的運動方式只有三種(假設當前我在(x,y)):
1、我可以走到(x+1,y)
2、我可以走到(x,y+1)
3、我可以走到(x+1,y+1)
這是個二維平面世界,平面上有n個特殊的果實,我從(0,0)點出發,希望得到盡量多的果實,但是出于某種特殊的原因,我的運動方式只有三種(假設當前我在(x,y)):
1、我可以走到(x+1,y)
2、我可以走到(x,y+1)
3、我可以走到(x+1,y+1)
現在我需要你的幫助,幫我找出我最多能夠得到多少個果實。
經典的二維dp,我們設f[i][j]表示。。。
非常水的一維dp,我們將所有的點按照x排序讓后做一次最長不下降子序列就好了
這里比較老實地用了離散化+數據結構,比二分好想多了。。。2333333
#pragma GCC optimize("O3") #pragma G++ optimize("O3") #include<stdio.h> #include<string.h> #include<algorithm> #define N 100010 #define mid (l+r>>1) using namespace std; struct dt{ int x,y; } s[N]; int n,v[N],r[N],m,w[N<<2],f[N]; inline bool c1(dt a,dt b){ return a.x<b.x; } void update(int l,int r,int x,int p,int k){if(l==r){ w[x]=max(w[x],k); return; }if(p<=mid) update(l,mid,x<<1,p,k);else update(mid+1,r,x<<1|1,p,k);w[x]=max(w[x<<1],w[x<<1|1]); } int query(int l,int r,int x,int L,int R){if(L<=l && r<=R) return w[x];int Ans=0;if(L<=mid) Ans=max(Ans,query(l,mid,x<<1,L,R));if(mid<R) Ans=max(Ans,query(mid+1,r,x<<1|1,L,R));return Ans; } int main(){freopen("find.in","r",stdin);freopen("find.out","w",stdout);scanf("%d",&n);for(int x,y,i=1;i<=n;++i){scanf("%d%d",&x,&y);if(x<0 || y<0){ --n; --i; }else s[i]=(dt){x,y};}sort(s+1,s+1+n,c1);for(int i=1;i<=n;++i) v[i]=s[i].y;sort(v+1,v+1+n); m=unique(v+1,v+1+n)-v-1; for(int i=1;i<=n;++i) r[i]=lower_bound(v+1,v+1+n,s[i].y)-v;for(int i=1;i<=n;++i){ f[i]=query(0,m,1,0,r[i])+1; update(0,m,1,r[i],f[i]); }printf("%d\n",w[1]); }
轉載于:https://www.cnblogs.com/Extended-Ash/p/9477264.html
總結
以上是生活随笔為你收集整理的Jzoj4845 寻找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyplot绘图标题错误处理
- 下一篇: SpringBoot(四)-- 整合Se