三维偏序,直接CDQ硬上。

正反两次CDQ统计结尾的方案数,最后统计即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=i;--i)
#define ll long double
#define maxn 50005
struct Mis{
int id,h,v;
void print()
{
printf("The ID %d High %d Speed %d\n",id,h,v);
}
}a[maxn];
int f[maxn][2],n,h[maxn],v[maxn],htop,vtop;
ll g[maxn][2];
bool cmp1(Mis a,Mis b){return a.id<b.id;}
bool cmp2(Mis a,Mis b){return a.h<b.h;}
int mx[maxn]; ll cnt[maxn];
void add(int x,int f,ll g)
{
for (;x<maxn;x+=x&(-x))
if (mx[x]==f) cnt[x]+=g;
else if (mx[x]<f) mx[x]=f,cnt[x]=g;
else break;
}
int qmx(int x)
{
int ret=0;
for (;x;x-=x&(-x)) ret=max(ret,mx[x]);
return ret;
}
ll qcnt(int x,int m)
{
ll ret=0;
for (;x;x-=x&(-x))
if (mx[x]==m) ret+=cnt[x];
return ret;
}
void del(int x)
{
for (;x<maxn;x+=x&(-x)) cnt[x]=mx[x]=0;
}
void CDQ(int l,int r,int flag)
{
if (l==r)
{
if (f[a[l].id][flag]<1)
{
g[a[l].id][flag]=f[a[l].id][flag]=1;
}
return ;
}
int mid=l+r>>1;
sort(a+l,a+r+1,cmp1);
CDQ(l,mid,flag);
sort(a+l,a+mid+1,cmp2);
sort(a+mid+1,a+r+1,cmp2);
int pl=l;
F(i,mid+1,r)
{
while (a[pl].h<=a[i].h&&pl<=mid) add(a[pl].v,f[a[pl].id][flag],g[a[pl].id][flag]),pl++;
int tmp=qmx(a[i].v)+1;
if (tmp==1) continue;
if (tmp>f[a[i].id][flag])
{
f[a[i].id][flag]=tmp;
g[a[i].id][flag]=qcnt(a[i].v,tmp-1);
}
else if (tmp==f[a[i].id][flag])
g[a[i].id][flag]+=qcnt(a[i].v,tmp-1);
}
F(i,l,pl-1) del(a[i].v);
CDQ(mid+1,r,flag);
}
void print()
{
int ans=0;
F(i,1,n) ans=max(ans,f[i][0]);
printf("%d\n",ans);
ll sum=0;
F(i,1,n) if (f[i][0]==ans) sum+=g[i][0]*g[n-i+1][1];
F(i,1,n)
{
if (f[i][0]+f[n-i+1][1]-1==ans) printf("%.5Lf ",g[i][0]*g[n-i+1][1]/sum);
else printf("0 ");
}
}
int main()
{
scanf("%d",&n);htop=vtop=n;
F(i,1,n)
{
scanf("%d%d",&a[i].h,&a[i].v);
a[i].id=i;h[i]=a[i].h;v[i]=a[i].v;
}
sort(h+1,h+htop+1); sort(v+1,v+vtop+1);
htop=unique(h+1,h+htop+1)-h-1; vtop=unique(v+1,v+vtop+1)-v-1;
F(i,1,n)
{
a[i].h=lower_bound(h+1,h+htop+1,a[i].h)-h;
a[i].v=lower_bound(v+1,v+vtop+1,a[i].v)-v;
}
F(i,1,n)
{
a[i].h=htop-a[i].h+1;
a[i].v=vtop-a[i].v+1;
}
CDQ(1,n,0);
F(i,1,n)
{
a[i].id=n-a[i].id+1;
a[i].v=vtop-a[i].v+1;
a[i].h=htop-a[i].h+1;
}
CDQ(1,n,1);
print();
}

  

BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治的更多相关文章

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

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

  2. BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)

    题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ...

  3. BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]

    传送门 题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率 $1A$了好开心 首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1] ...

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

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

  5. [BZOJ2244][SDOI2011]拦截导弹 CDQ分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MB  Special Judge Description 某国为了防御敌国的导弹 ...

  6. bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...

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

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

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

    #include<cstdio> #include<iostream> #include<algorithm> #define M 100009 using nam ...

  9. bzoj 2244 [SDOI2011]拦截导弹(dp+CDQ+树状数组)

    传送门 题解 看了半天完全没发现这东西和CDQ有什么关系…… 先把原序列翻转,求起来方便 然后把每一个位置表示成$(a,b,c)$其中$a$表示位置,$b$表示高度,$c$表示速度,求有多少个位置$a ...

随机推荐

  1. Verilog 参数化设计

    为了提高模块的重复利用,关键就在于避免硬编码(hard literal),使模块参数化.参数化建模的好处是可以使代码清晰,便于后续维护和修改.只需要修改参数,不用修改其他代码就可以适用于不同的环境中. ...

  2. sql中保留2位小数

    问题: 数据库里的 float momey 类型,都会精确到多位小数.但有时候 我们不需要那么精确,例如,只精确到两位有效数字. 解决: 1. 使用 Round() 函数,如 Round(@num,2 ...

  3. 如何启动Intel VT-x

    如何启动Intel VT-x 5 在64bit win7系统下安装了Vmware10,然后安装64位的UbuntuKylin 14.04,想要打开UbuntuKylin,弹出如下对话框: 请问该如何启 ...

  4. 改变console.log的输出样式

    console.log允许你通过css来格式化输出,格式如下: console.log(‘%c字符串%c字符串’, 样式1, [样式2]) 其中”%c”为模板字符串 例子: 1 console.log ...

  5. mysql的备份与恢复详解

    一.为什么要备份 在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据 ...

  6. Linux系统分区 进程管理 软件包安装

    对于一块新的磁盘来说,系统能够使用需要有分区.格式化文件系统.挂载等主要操作,下面通过命令的方式对一块磁盘进行操作. 一. Linux系统分区 1.1 在虚拟机开机前选择虚拟机配置,添加一个新的SCS ...

  7. LeetCode || 大杂烩w

    454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...

  8. [BZOJ4899]:记忆的轮廓(概率DP)

    题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...

  9. Bootstrap历练实例:弹出提示信息的样式按钮

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. 总结:JavaScript异步、事件循环与消息队列、微任务与宏任务

    本人正在努力学习前端,内容仅供参考.由于各种原因(不喜欢博客园的UI),大家可以移步我的github阅读体验更佳:传送门,喜欢就点个star咯,或者我的博客:https://blog.tangzhen ...