jzoj3833-平坦的折线【模型转换,LIS】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3833-平坦的折线【模型转换,LIS】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://jzoj.net/senior/#contest/show/2930/3
題目大意
一個平面直角坐標系上有nnn個點,如果兩個點之間斜率在?1~1-1\sim 1?1~1之間那么就可以連接,求最少多少條折線可以連接這些點。
解題思路
我們將整個坐標系逆時針選擇45°(45^{\circ}(45°(變為(x+y,y?x)(x+y,y-x)(x+y,y?x)))),然后每個點可以連接的位置就變成了右上方的矩形。
我們將點按照橫坐標排序,問題就變為了一個序列,至少可以拆成多少個多少個不降序列。就是導彈攔截的第二問,答案就是最長上升子序列的長度。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=31000; struct node{int num,w; }a[N]; int n,q[N],tail; bool cmp(node x,node y) {return (x.num==y.num)?x.w>y.w:x.num<y.num;} int main() {freopen("lam.in","r",stdin);freopen("lam.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){int x,y; scanf("%d%d",&x,&y);a[i]=(node){x+y,y-x};}sort(a+1,a+1+n,cmp);q[++tail]=a[1].w;for(int i=2;i<=n;i++){if(a[i].w>q[tail]) q[++tail]=a[i].w;else{int z=lower_bound(q+1,q+1+tail,a[i].w)-q;q[z]=a[i].w;}}printf("%d",tail); }總結
以上是生活随笔為你收集整理的jzoj3833-平坦的折线【模型转换,LIS】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三国杀英魂技能 英魂技能介绍
- 下一篇: jzoj3844-统计损失【树形dp,换