2244: [SDOI2011]拦截导弹

Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special Judge
Submit: 237  Solved: 103
[Submit][Status][Discuss]

Description


国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导
弹,但是以后每一发炮弹都不能高于前一发的高度,其拦截的导弹的飞行速度也不能大于前一发。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所
以只有一套系统,因此有可能不能拦截所有的导弹。

在不能拦截所有的导弹的情况下,我们当然要选择使国家损失最小、也就是拦截导弹的数量最多的方案。但是拦截导弹数量的最多的方案有可能有多个,如果有多个最优方案,那么我们会随机选取一个作为最终的拦截导弹行动蓝图。

我方间谍已经获取了所有敌军导弹的高度和速度,你的任务是计算出在执行上述决策时,每枚导弹被拦截掉的概率。

Input

第一行包含一个正整数n,表示敌军导弹数量;

下面行按顺序给出了敌军所有导弹信息:

第i+1行包含2个正整数hi和vi,分别表示第枚导弹的高度和速度。

Output

输出包含两行。

第一行为一个正整数,表示最多能拦截掉的导弹数量;

第二行包含n个0到1之间的实数,第i个数字表示第i枚导弹被拦截掉的概率(你可以保留任意多位有效数字)。

Sample Input

4

3 30

4 40

6 60

3 30

Sample Output

2

0.33333 0.33333 0.33333 1.00000

【数据规模和约定】

对于100%的数据,1≤n≤5*104, 1≤hi ,vi≤109;

均匀分布着约30%的数据,所有vi均相等。

均匀分布着约50%的数据,满足1≤hi ,vi≤1000。

HINT

鸣谢kac提供sj程序!

  这次算是把cdq分治给搞懂了。这道题的做法网上的题解说的已经比较详细了,这里就不重复了。

  值得注意的是,随机选择最优方案和沿着最优方案等概率向后走是两个完全不同的东西,后者还要复杂一些,要正扫反扫正扫三遍分治,然而我居然写的就是那个。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100000
#define MAXT MAXN*4
#define lch (now<<1)
#define rch (now<<1^1)
#define smid ((l+r)>>1)
#define INF 0x3f3f3f3f
typedef double real;
struct aaa
{
aaa(){}
aaa(int x,int y,int id):x(x),y(y),id(id){}
int x,y;
int id;
}al[MAXN];
bool cmp_x(aaa a1,aaa a2)
{
return a1.x<a2.x;
}
bool cmp_y(aaa a1,aaa a2)
{
return a1.y<a2.y;
}
bool cmp_id(aaa a1,aaa a2)
{
return a1.id<a2.id;
}
struct bbb
{
int id;
int opt;
int x,y,pos;
int d;
//opt==1(Modify (x,y) [+/-])
//opt==2(Query [x,y] into z[+/-]);
}bl[MAXN],cl[MAXN];
bool cmp_bbb_x(bbb b1,bbb b2)
{
if (b1.x==b2.x)return b1.opt<b2.opt;
return b1.x<b2.x;
}
bool cmp_bbb_x2(bbb b1,bbb b2)
{
if (b1.x==b2.x)return b1.opt<b2.opt;
return b1.x>b2.x;
}
bool cmp_bbb_id(bbb b1,bbb b2)
{
return b1.id<b2.id;
}
int totb=;
int totnxt[MAXN];
int maxx,maxy;
pair<int,real> dpv[MAXN],dpv2[MAXN];
template<typename T> pair<int,T> deal(pair<int,T> p1,pair<int,T> p2)
{
if (p1.first==p2.first)
return make_pair(p1.first,p1.second+p2.second);
else if (p1.first<p2.first)
return p2;
else
return p1;
}
bool rev;
pair<int,real> tarr[MAXN];
void Add_tarr(int pos,pair<int,real> pr)
{
if (rev)pos=maxy+-pos;
while (pos<MAXN)
{
tarr[pos]=deal(tarr[pos],pr);
pos+=pos&(-pos);
}
}
void Clear_tarr(int pos)
{
if (rev)pos=maxy+-pos;
while (pos<MAXN)
{
tarr[pos]=make_pair(,);
pos+=pos&(-pos);
}
}
pair<int,real> Qry_tarr(int pos)
{
if (rev)pos=maxy+-pos;
pair<int,real> ret=make_pair(-INF,);
while (pos)
{
ret=deal(ret,tarr[pos]);
pos-=pos&(-pos);
}
return ret;
}
void solve(int l,int r)
{
if (l==r)return ;
int mid=(l+r)>>;
solve(l,mid);
int totc=;
for (int i=l;i<=mid;i++)
if (bl[i].opt==)
cl[totc++]=bl[i];
for (int i=mid+;i<=r;i++)
if (bl[i].opt==)
cl[totc++]=bl[i];
if (rev)
sort(cl,cl+totc,cmp_bbb_x2);
else
sort(cl,cl+totc,cmp_bbb_x);
for (int i=;i<totc;i++)
{
if (cl[i].opt==)
{
Add_tarr(cl[i].y,dpv[cl[i].pos]);
}else if (cl[i].opt==)
{
pair<int,real> res=Qry_tarr(cl[i].y);
res.first++;
dpv[cl[i].pos]=deal(dpv[cl[i].pos],res);
}
}
for (int i=;i<totc;i++)
{
if (cl[i].opt==)
{
Clear_tarr(cl[i].y);
}
}
sort(bl+l,bl+r+,cmp_bbb_id);
solve(mid+,r);
} int main()
{
freopen("input.txt","r",stdin);
int n,m,x,y,z;
scanf("%d",&n);
al[]=aaa(INF/,INF/,);
for (int i=;i<=n;i++)
{
scanf("%d%d",&al[i].x,&al[i].y);
al[i].id=i;
}
n++;
al[n]=aaa(-INF/,-INF/,n);n++;
sort(al,al+n,cmp_x);
x=-INF;y=;
for (int i=;i<n;i++)
{
if (al[i].x!=x)y++;
x=al[i].x;
al[i].x=y;
}
maxx=y;
sort(al,al+n,cmp_y);
x=-INF,y=;
for (int i=;i<n;i++)
{
if (al[i].y!=x)y++;
x=al[i].y;
al[i].y=y;
}
maxy=y;
sort(al,al+n,cmp_id);
//====================================
totb=;
for (int i=n-;i>=;i--)
{
bl[totb].opt=;
bl[totb].x=al[i].x;
bl[totb].y=al[i].y;
bl[totb].pos=i;
bl[totb].d=;
bl[totb].id=totb;
totb++;
bl[totb].opt=;
bl[totb].x=al[i].x;
bl[totb].y=al[i].y;
bl[totb].pos=i;
bl[totb].id=totb;
totb++;
}
dpv[n-]=make_pair(,);
solve(,totb-);
//for (int i=0;i<n;i++)printf("%d %.2lf\n",dpv[i].first,dpv[i].second);
memcpy(dpv2,dpv,sizeof(dpv));
memset(dpv,,sizeof(dpv2));
totb=;
for (int i=;i<n;i++)
{
bl[totb].opt=;
bl[totb].x=al[i].x;
bl[totb].y=al[i].y;
bl[totb].pos=i;
bl[totb].id=totb;
totb++;
bl[totb].opt=;
bl[totb].x=al[i].x;
bl[totb].y=al[i].y;
bl[totb].pos=i;
bl[totb].id=totb;
totb++;
}
dpv[]=make_pair(,);
rev=true;
solve(,totb-);
//for (int i=0;i<n;i++)printf("%d %.2lf\n",dpv[i].first,dpv[i].second);
printf("%d\n",dpv[n-].first-);
for (int i=;i<n-;i++)
if (dpv[i].first+dpv2[i].first!=dpv[n-].first)
printf("%.5lf ",0.0);
else
printf("%.5lf ",dpv[i].second*dpv2[i].second/dpv[n-].second);
}

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

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

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

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

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

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

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

  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. 利用Qt调用计算器

    之前有了第一个项目那么很快就会有第二个 这次 我们来调用 一些系统函数. 就不从头写了. 直接写比较重要的地方,如果又不太懂的地方欢迎小纸条或者参见利用 QT制作一个 helloworld http: ...

  2. FxCop

    下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=8279 FxCop是一个代码分析工具,和StyleCop(代码规范)一起配合 ...

  3. 网页设定固定背景图片(抄袭自百度FM)

    这个新技能,我是从百度FM中学习到的. 在网页中,有一个id为"body-bg"的层, html代码: <div id="body-bg" style=& ...

  4. 闲话:你今天OO了吗?

    如果你的分析习惯是在调研技术的时候最先弄清楚有多少业务流程,先画出业务流程图,然后顺藤摸瓜,找出业务流程中每一步骤的参与部门或岗位,弄清楚在这一步参与者所做的事情和填写表单的结果,并关心用户是如何把这 ...

  5. Magento 中的多个类别的筛选产品集合

    通过在 Magento 中的多个类别的筛选产品集合. 按只 1 类别筛选 Magento 提供筛选器,可以使用直接从该集合的类型: $_category = Mage::getModel('catal ...

  6. ThinkPHP函数详解:F方法

    我们已经了解了ThinkPHP中的S方法的用法,F方法其实是S方法的一个子集功能,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,因为采用的是PHP返回方式,所以其效率较S方法较高,因此我 ...

  7. .Net之美读书系列(一):委托与事件

    开启新的读书之旅,这次读的书为<.Net之美:.Net关键技术深入解析>. 我是选择性阅读的,把一些自己觉得容易忘记的,或者比较重要的知识点记录下来,以便以后能方便呢查阅. 尊重书本原作者 ...

  8. 循环json里面的数据

    {{each company as cvalue i}}   {{each value.Goods as gvalue i}}   {{each gvalue.SKU as value i}}     ...

  9. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  10. iOS imagePicker使用方法,方便使用!三步轻松搞定!

    自己总结的修改头像的方法,只为方便自己查询使用!转发 步骤:1.遵守代理协议 <UIImagePickerControllerDelegate,UINavigationControllerDel ...