#include<cstdio>
#include<iostream>
#include<algorithm>
#define M 100009
using namespace std;
struct data
{
int x,y,z,f[];
double sum[];
}a[M],b[M];
struct ss
{
int w;
double su;
}shu[M];
int n,yy[M],zz[M],yl,zl,ans,tot,sta[M];
double sum1;
bool cmp(data a1,data a2)
{
if(a1.y==a2.y)
return a1.x<a2.x;
return a1.y<a2.y;
}
bool cmp1(data a1,data a2)
{
return a1.x>a2.x;
}
void updata(int i,int p)
{
int a1=a[i].z;
for(;a1<=zl;a1+=a1&-a1)
if(shu[a1].w<a[i].f[p])
{
if(shu[a1].w==)
sta[++tot]=a1;
shu[a1].w=a[i].f[p];
shu[a1].su=a[i].sum[p];
}
else if(shu[a1].w==a[i].f[p])
shu[a1].su+=a[i].sum[p];
return;
}
void ask(int i,int p)
{
int a1=a[i].z;
for(;a1;a1-=a1&-a1)
if(a[i].f[p]<=shu[a1].w&&shu[a1].w)
{
a[i].f[p]=shu[a1].w+;
a[i].sum[p]=shu[a1].su;
}
else if(a[i].f[p]==shu[a1].w+)
a[i].sum[p]+=shu[a1].su;
return;
}
void solve(int l,int r,int p)
{
if(l==r)
{
if(a[l].f[p]==)
a[l].f[p]=a[l].sum[p]=;
return;
}
int mid=(l+r)>>;
int l1=l,l2=mid+;
for(int i=l;i<=r;i++)
if(a[i].x<=mid)
b[l1++]=a[i];
else
b[l2++]=a[i];
for(int i=l;i<=r;i++)
a[i]=b[i];
solve(l,mid,p);
sort(a+l,a+mid+,cmp);
int st=l;
for(int i=mid+;i<=r;i++)
{
for(;a[st].y<=a[i].y&&st<=mid;st++)
updata(st,p);
ask(i,p);
}
for(int i=;i<=tot;i++)
shu[sta[i]].w=shu[sta[i]].su=;
tot=;
solve(mid+,r,p);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
a[i].x=i;
scanf("%d%d",&a[i].y,&a[i].z);
yy[i]=a[i].y;
zz[i]=a[i].z;
}
sort(yy+,yy+n+);
sort(zz+,zz+n+);
yl=unique(yy+,yy+n+)-yy-;
zl=unique(zz+,zz+n+)-zz-;
for(int i=;i<=n;i++)
{
a[i].y=yl-(lower_bound(yy+,yy+yl+,a[i].y)-yy)+;
a[i].z=zl-(lower_bound(zz+,zz+zl+,a[i].z)-zz)+;
}
sort(a+,a+n+,cmp);
solve(,n,);
for(int i=;i<=n;i++)
{
a[i].x=n-a[i].x+;
a[i].y=yl-a[i].y+;
a[i].z=zl-a[i].z+;
}
sort(a+,a+n+,cmp);
solve(,n,);
sort(a+,a+n+,cmp1);
for(int i=;i<=n;i++)
if(a[i].f[]>ans)
{
ans=a[i].f[];
sum1=a[i].sum[];
}
else if(a[i].f[]==ans)
sum1+=a[i].sum[];
printf("%d\n",ans);
for(int i=;i<=n;i++)
if(a[i].f[]+a[i].f[]-==ans)
printf("%.5lf ",a[i].sum[]*a[i].sum[]/sum1);
else
printf("0.00000 ");
return ;
}

首先第一问明显是一个三维偏序集,速度,高度,时间,用CDQ分治做,然后我们把它反过来,在做一边CDQ分治,这两遍求出来的方案数组相乘,就是过这个点的方案数。

bzoj 2244: [SDOI2011]拦截导弹的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治

    三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include < ...

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

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

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

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

  9. BZOJ:2244: [SDOI2011]拦截导弹

    问题: printf("%.5f ",0):为什么错了? 注意: 初始值很重要 题解: 三维偏序问题: 记录从前往后最长上升子序列长度pref,条数preg 从后往前suff,su ...

随机推荐

  1. spring事务知识

    事务的传播行为? 在Spring 的事务中, _可以通过 propagation 来定义事务的传播行为_: PROPAGATION_required:如果当前没有事务,就新建一个事务,如果已经存在一个 ...

  2. Monkey学习(4)简单测试实例

    1.首先测试设备是否连接成功,在命令行中输入: adb devices 如果出现设备信息,代表链接成功.我这里的设备名称是“emulator-5554” 2.得到测试apk的包名,如果有APK源码包的 ...

  3. JQuery $()后面的括号里的内容什么时候加引号,什么时候不加

    一.如果是已经声明存在的变量或者对象,就不用加引号. 比如var name=document.getElementById("name"); $(name)或者$(this). 二 ...

  4. Android控件之CheckBox(复选框控件)

    一.有两种状态: 选中状态(true).未选中状态(false) 二.属性 android:id = "@+id/checkbox" android:layout_width=&q ...

  5. Css3_必备10个东西

    1.边框圆角(Border Radiuas) 这个是我们在平常很常用的吧,以前我在用div圆角的时候,特别特别的痛苦,不管是用CSS来画圆角,还是用图片来画圆角都不那么容易,但是现在好了,在CSS3中 ...

  6. mysql使用笔记(三)

    一.数值类型 1. 数值类型     标准sql中包含数据类型 INTEGER, SMALLINT, DECIMAL, NUMERIC,以及FLOAT, REAL, DOUBLE.mysql在此基础上 ...

  7. 微信jssdk

    http://203.195.235.76/jssdk/?from=timeline&isappinstalled=0

  8. 日期操作类--DateFormat类

    简单的DateFormat格式化编码 时间模式字符串用来指定时间格式.在此模式中,所有的ASCII字母被保留为模式字母,定义如下: 字母 描述 示例 G 纪元标记 AD y 四位年份 2001 M 月 ...

  9. 【EPplus】Column width discrepancy

    description Hi Jan, I have noticed that when I set a column width there is a discrepancy between the ...

  10. Java GC系列(1):Java垃圾回收简介

    本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...