CF 249D Donkey and Start

Posted cjoiershiina-mashiro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF 249D Donkey and Start相关的知识,希望对你有一定的参考价值。

Link
((a,b),(c,d))为基建系,并将原来的原点也加入序列,那么题目就转化为打乱顺序之后找一个最长的(x,y)坐标都单调上升的子序列。
(x)坐标为第一关键字,(y)坐标为第二关键字降序排序,题目就转化为了找以原来的原点为结束位置的LDS,离散化后BIT维护即可。

#include<cstdio>
#include<cctype>
#include<numeric>
#include<algorithm>
using i64=long long;
int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))(x*=10)+=c&15,c=getchar();return x;}
const int N=100007;
struct node{i64 x,y;}p[N],q[N];
i64 h[N];int n,id[N],t[N];
void add(int p,int v){for(;p<=n;p+=p&-p)t[p]=std::max(t[p],v);}
int ask(int p){int r=0;for(;p;p^=p&-p)r=std::max(r,t[p]);return r;}
int main()
{
    n=read();int a=read(),b=read(),c=read(),d=read();
    for(int i=1,x,y;i<=n;++i) x=read(),y=read(),p[i]={x,y},q[i]={1ll*b*y-1ll*a*x,h[i]=1ll*d*y-1ll*c*x};
    ++n,std::iota(id+1,id+n+1,1),std::sort(h+1,h+n+1),std::sort(id+1,id+n+1,[](int i,int j){return q[i].x>q[j].x||(q[i].x==q[j].x&&q[i].y>q[j].y);});
    for(int i=1;i<=n;++i) q[i].y=std::lower_bound(h+1,h+n+1,q[i].y)-h;
    for(int j=1,i;i=id[j],j<=n;add(q[i].y,ask(q[i].y-1)+1),++j) if(!p[i].x&&!p[i].y) return !printf("%d",ask(q[i].y-1));
}

以上是关于CF 249D Donkey and Start的主要内容,如果未能解决你的问题,请参考以下文章

CF98EHelp Shrek and Donkey

Codeforces 98E Help Shrek and Donkey 游戏策略神题

CF785D Anton and School - 2(范德蒙德行列式卷积)

CF914G Sum the Fibonacci FWT子集卷积

Lunch War with the Donkey CSU - 2084

(CF#257)B. Jzzhu and Sequences