这个题看起来是二维偏序,但实际上是三维偏序(高度、速度、顺序)

所以就用顺序减掉一维,cdq减掉一维,用数据结构减掉一维,

然后求每个点的概率就等于 经过他的方案数/方案总数

然后首先要知道lis的答案,用cdq分治转移一遍即可出解,但由于要算方案总数,所以需要记录 到一个点 dp值最大时的方案数

但经过他的方案数不只有到一个点的方案数,还有他到终点的方案数,

这时有一个比较显然的结论,对于最长的lis上的每一个点, 存在的充要条件是 前面比他小的点的个数+后面比他大的点的个数=答案-1

对于方案就是用乘法原理,两个方案乘起来即可

比较难写,注意可能会爆int,需要用double

码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
#define N 100005
int ql[N<<2],maxx[N<<2],a,b,op,c,n,lin[N],ans,zz;
double cnt,sz[N<<2],d;
struct la
{int a,b,c,f,g;double sz,sz2;
}D[50005];
void up(int o)
{int ll=o<<1,rr=o<<1|1;
if(maxx[ll]==maxx[rr])
{sz[o]=sz[ll]+sz[rr];
}else
{
if(maxx[ll]<maxx[rr])swap(ll,rr);
maxx[o]=maxx[ll];
sz[o]=sz[ll];
}
}
void push(int o)
{int ll=o<<1,rr=o<<1|1;
if(ql[o])
{ql[ll]=ql[rr]=1;maxx[ll]=0;maxx[rr]=0; sz[ll]=0;sz[rr]=0;ql[o]=0;
}
}
void gai(int o,int l,int r)
{if(a<=l&&r<=b){if(op==0){if(c==maxx[o])sz[o]+=d;if(c>maxx[o])sz[o]=d,maxx[o]=c;}else{
if(c==maxx[o])d+=sz[o];
if(c<maxx[o])c=maxx[o],d=sz[o];            }return ;}push(o);int mid=(l+r)>>1;if(a<=mid)gai(zuo);if(b>mid)gai(you);up(o);
}
bool cmpa(la A,la B)
{return A.a>B.a;
}
bool cmpaa(la A,la B)
{return A.a<B.a;
}
bool cmpb(la A,la B)
{return A.b<B.b;
}
bool cmpc(la A,la B)
{return A.c<B.c;
}
bool cmpcc(la A,la B)
{return A.c>B.c;
}
void cdq(int l,int r)
{int mid=(l+r)>>1,i;if(l==r)return;cdq(l,mid);
sort(D+l,D+mid+1,cmpa);
sort(D+mid+1,D+r+1,cmpa);
zz=l;for(i=mid+1;i<=r;i++){while(D[zz].a>=D[i].a&&zz<=mid){a=b=D[zz].b;c=D[zz].f;d=D[zz].sz;op=0;gai(1,1,n);zz++;}a=D[i].b;b=n;c=d=0;op=1;if(a<=b)gai(1,1,n);if(D[i].f==c+1)D[i].sz+=d;else if(D[i].f<c+1){D[i].f=c+1;D[i].sz=d;}  }//清零maxx[1]=0;    sz[1]=0;ql[1]=1;sort(D+mid+1,D+r+1,cmpc);cdq(mid+1,r);
}
void cdq2(int l,int r)
{int mid=(l+r)>>1,i;if(l==r)return;cdq2(l,mid);
sort(D+l,D+mid+1,cmpaa);
sort(D+mid+1,D+r+1,cmpaa);
zz=l;for(i=mid+1;i<=r;i++){while(zz<=mid&&D[zz].a<=D[i].a){a=b=D[zz].b;c=D[zz].g;d=D[zz].sz;op=0;gai(1,1,n);zz++;}a=1;b=D[i].b;c=d=0;op=1;if(a<=b)gai(1,1,n);if(D[i].g==c+1)D[i].sz+=d;if(D[i].g<c+1){D[i].g=c+1;D[i].sz=d;}}//清零maxx[1]=0;sz[1]=0;ql[1]=1;sort(D+mid+1,D+r+1,cmpcc);cdq2(mid+1,r);
}
int main()
{int i;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&D[i].a,&D[i].b),D[i].c=i;sort(D+1,D+1+n,cmpb);for(i=1;i<=n;i++){D[i].f=D[i].g=D[i].sz=1;if(D[i].b==D[i-1].b)lin[i]=lin[i-1];else lin[i]=i;        }for(i=1;i<=n;i++)D[i].b=lin[i];sort(D+1,D+1+n,cmpc);cdq(1,n);for(i=1;i<=n;i++)ans=max(ans,D[i].f),D[i].sz2=D[i].sz,D[i].sz=1;
printf("%d\n",ans);
for(i=1;i<=n;i++)
{if(D[i].f==ans)cnt+=D[i].sz2;
}
sort(D+1,D+1+n,cmpcc);cdq2(1,n);
sort(D+1,D+1+n,cmpc);
for(i=1;i<=n;i++)
{
if(D[i].g+D[i].f==ans+1)printf("%.5lf ",(D[i].sz*D[i].sz2)/(cnt));
else printf("0.00000 ");
}
}

bzoj2244 [SDOI2011]拦截导弹 cdq分治相关推荐

  1. BZOJ2244: [SDOI2011]拦截导弹(CDQ分治,二维LIS,计数)

    Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高 ...

  2. bzoj 2244: [SDOI2011]拦截导弹 cdq分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 237  Solved: ...

  3. BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】

    题目 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度,其 ...

  4. BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治

    2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...

  5. P2487 [SDOI2011]拦截导弹(cdq分治/计数问题思想)

    P2487 [SDOI2011]拦截导弹 求解二维上的LIS,并且要求出每个点的选中概率. 首先对于每个点的选中概率,可以通过方案数计算,那么就是选中它的方案数除以总方案数.关键在于选中它的方案数怎么 ...

  6. bzoj 2244: [SDOI2011]拦截导弹

    Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高 ...

  7. BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)

    题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...

  8. [偏序关系与CDQ分治]【学习笔记】

    组合数学真是太棒了 $CDQ$真是太棒了(雾 参考资料: 1.<组合数学> 2.论文 课件 很容易查到 3.sro __stdcall 偏序关系 关系: 集合$X$上的关系是$X$与$X$ ...

  9. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

最新文章

  1. python界面设计-手把手教你用Python设计一个简单的命令行界面
  2. hdu4282 x^z+y^z+x*y*z=k 解的个数
  3. 生成树协议基础—Vecloud微云
  4. 数据库连接报错:Listener refused the connection with the following error: ORA-12505 的解决方法
  5. ASP.NET MVC入门---实例演示:通过ContentResult实现主题定制
  6. P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp
  7. caffe 实践程序4——cifar10网络
  8. linux shell 常用命令总结
  9. 使用Kotlin编写Gradle插件
  10. java fop_java – Apache FOP使用SimSun显示###
  11. 线性代数————思维导图(上岸必备)(向量组)
  12. 【英语语法入门】 第23讲 动词的用法
  13. 更改C盘用户文件夹名
  14. 使用 SkyEye 模拟 ARM Linux
  15. Android加载本地大Bitmap文件,解析出来的Bitmap是整张图片是黑色的
  16. 弱网测试工具使用--web/pc/app
  17. gunicorn 详解
  18. ubuntu22从双系统开始到深度学习环境搭建+必备软件安装
  19. OpenCV:视频跳转
  20. CART树(分类回归树)

热门文章

  1. Docker存储卷基本操作
  2. WPS关于尾注的细节
  3. python 读取txt文件没读到400行_400行Python代码实现文语处理助手(3) - 音频显示-嵌入式系统-与非网...
  4. spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
  5. Java判断一个数是不是素数
  6. MongoDB数据库操作---终端操作
  7. mongodb数组更新操作符$push
  8. led伏安特性实验误差分析_高中物理 | 电学实验满分知识点总结+拓展+例题精讲,罕见的好资料,收藏不亏!...
  9. oracle怎么定时执行存储过程6,Oracle中如何定时调用存储过程
  10. Java练习02 打印三角形