题目描述

题解:

对于第一问,我们求二维LIS即可;

对于第二问,我们可以记录向前最长长度,向前最长方案数,向后最长长度,向后最长方案数。

其实改改树状数组即可。

还有,方案数一定要开double。

代码:

#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50050
inline int rd()
{
int f=,c=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=*c+ch-'';ch=getchar();}
return f*c;
}
int n;
struct node
{
int h,v,s,f,g;
double w1,w2;
}p[N],tmp[N];
bool cmph(node a,node b)
{
return a.h>b.h;
}
bool cmpH(node a,node b)
{
return a.h<b.h;
}
bool cmps(node a,node b)
{
return a.s<b.s;
}
struct pR
{
int x,y;
}ph[N],pv[N];
struct Pair
{
int x;
double y;
Pair(){x=,y=0.0;}
Pair(int x,double y):x(x),y(y){}
};
bool cmp(pR a,pR b)
{
return a.x<b.x;
}
struct BIT
{
Pair v[N];
void up(int x,int d,double c)
{
while(x<N)
{
if(v[x].x<d)v[x]=Pair(d,c);
else if(v[x].x==d)v[x].y+=c;
x+=(x&-x);
}
}
void clear(int x)
{
while(x<N&&v[x].x)
{
v[x]=Pair(,0.0);
x+=(x&-x);
}
}
Pair down(int x)
{
Pair ret;
while(x)
{
if(v[x].x>ret.x)ret=v[x];
else if(v[x].x==ret.x)ret.y+=v[x].y;
x-=(x&-x);
}
return ret;
}
}tr;
int max_v;
void cdq(int l,int r)
{
if(l==r)return ;
int mid = (l+r)>>;
cdq(l,mid);
sort(p+l,p+mid+,cmph);
sort(p+mid+,p+r+,cmph);
int i,j;
for(i=mid+,j=l;i<=r;i++)
{
while(j<=mid&&p[i].h<=p[j].h)
{
tr.up(max_v-p[j].v,p[j].f,p[j].w1);
j++;
}
Pair tm = tr.down(max_v-p[i].v);
if(p[i].f<tm.x+)
{
p[i].f=tm.x+;
p[i].w1=tm.y;
}else if(p[i].f==tm.x+)p[i].w1+=tm.y;
}
for(j=j-;j>=l;j--)tr.clear(max_v-p[j].v);
sort(p+l,p+r+,cmps);
cdq(mid+,r);
}
void CDQ(int l,int r)
{
if(l==r)return ;
int mid = (l+r)>>;
CDQ(mid+,r);
sort(p+l,p+mid+,cmpH);
sort(p+mid+,p+r+,cmpH);
int i,j;
for(i=l,j=mid+;i<=mid;i++)
{
while(j<=r&&p[i].h>=p[j].h)
{
tr.up(p[j].v,p[j].g,p[j].w2);
j++;
}
Pair tm = tr.down(p[i].v);
if(p[i].g<tm.x+)
{
p[i].g=tm.x+;
p[i].w2=tm.y;
}else if(p[i].g==tm.x+)p[i].w2+=tm.y;
}
for(j=j-;j>mid;j--)tr.clear(p[j].v);
sort(p+l,p+r+,cmps);
CDQ(l,mid);
}
int ans;
int main()
{
n=rd();
for(int h,v,i=;i<=n;i++)
{
h=rd(),v=rd();
ph[i].x=h,ph[i].y=i;
pv[i].x=v,pv[i].y=i;
p[i].s=i;
}
sort(ph+,ph++n,cmp);
for(int las=-,k=,i=;i<=n;i++)
{
if(las!=ph[i].x)
{
las = ph[i].x;
k++;
}
p[ph[i].y].h=k;
}
sort(pv+,pv++n,cmp);
for(int las=-,k=,i=;i<=n;i++)
{
if(las!=pv[i].x)
{
las = pv[i].x;
k++;
max_v=k+;
}
p[pv[i].y].v=k;
}
for(int i=;i<=n;i++)p[i].f=,p[i].w1=1.0;
cdq(,n);
for(int i=;i<=n;i++)ans=max(ans,p[i].f);
printf("%d\n",ans);
for(int i=;i<=n;i++)p[i].g=,p[i].w2=1.0;
CDQ(,n);
double sum = ;
for(int i=;i<=n;i++)
{
if(p[i].f+p[i].g-==ans)
{
sum+=p[i].w1*p[i].w2;
}
}
sum/=(double)ans;
for(int i=;i<=n;i++)
{
if(p[i].f+p[i].g-==ans)
{
printf("%.5lf ",p[i].w1*p[i].w2/sum);
}else
{
printf("0.00000 ");
}
}
printf("\n");
return ;
}

SDOI2011 拦截导弹的更多相关文章

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

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

  2. 【BZOJ2244】[SDOI2011]拦截导弹(CDQ分治)

    [BZOJ2244][SDOI2011]拦截导弹(CDQ分治) 题面 BZOJ 洛谷 题解 不难发现这就是一个三维偏序+\(LIS\)这样一个\(dp\). 那么第一问很好求,直接\(CDQ\)分治之 ...

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

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

  4. 【LG2481】[SDOI2011]拦截导弹

    [LG2481][SDOI2011]拦截导弹 题面 洛谷 题解 可以看出第一问就是一个有关偏序的\(LIS\),很显然可以用\(CDQ\)优化 关键在于第二问 概率\(P_i=\) \(总LIS数\) ...

  5. P2487 [SDOI2011]拦截导弹

    题目 P2487 [SDOI2011]拦截导弹 做\(SDOI\)有种想评黑的感觉,果然还是太弱了 做法 独立写(调)代码三个小时祭 简化题目:求二维最长不上升子序列及每个点出现在最长不上升子序列概率 ...

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

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

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

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

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

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

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

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

  10. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

随机推荐

  1. TP5之model

    使用model 查询数据,添加数据,修改数据,删除数据 聚合操作 获取器,修改器 自动添加时间戳(创建时间,修改时间) 软删除 1.使用model查询数据 $res = User::get(1); / ...

  2. SVG如何嵌套在HTML中

    1.使用HTML标签 以下三个标签所有主流浏览器都支持 a.<iframe>标签 优势:允许使用脚本 缺点:虽然不是HTML5的新增标签,但是不推荐在HTML4 和 XHTML中使用 例: ...

  3. rpm -e ** error :No such file or directory 解决

    参考文章:http://www.redhat.com/archives/rpm-list/2006-June/msg00025.html 我遇到的情况是这样的: 1 先安装包 rpm -ivh tes ...

  4. C/C++程序计时函数gettimeofday的使用

    linux 环境下 用 clock_t发现不准. 换用 //头文件 #include <sys/time.h> //使用timeval start, end;   gettimeofday ...

  5. .NET Core WebAPI Swagger使用

    相对于普通的webapi而言,.net core webapi本身并不具备文档的功能,所以可以借助第三方插件:swagger,使用的话很简单. 步骤一. Nuget Packages安装,使用程序包管 ...

  6. PHP连接数据操作步骤

    数据库的操作步骤: 端口号:0到65535 3306:mysql数据库的默认端口号(可修改) mysql_connect(“本机地址”,“用户名”,“密码”,); new_link:如果用同样的参数第 ...

  7. [转]VC++中对文件的写入和读取

    本文转自:http://blog.csdn.net/fanghb_1984/article/details/7425705 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用 ...

  8. C#将excel数据按照需求导入Sql server遇到的问题(参考而已)

    1.千万不要使用永中表格(WPS没用过,这里只是个人观点,不是说永中表格的) 我在公司得到的任务是将excel数据按照需求导入数据库总共主表大概3张,所以有点复杂(列子用的简单表,公司东西还是不要放出 ...

  9. Andriod 简介

    Andriod系统采用分层架构,分为4层: 应用程序层(Applications) 包含所有安装在手机上的应用程序(包括系统自带的程序) 应用程序框架层(Application Framework) ...

  10. Git-远程操作

    远程分支:远程跟踪分支remote branch是对远程分支状态的引用,是不能移动的,它会根据远程分支变化以及网络通信自动移动.Git服务器包含了远程分支master,在My Computer中的re ...