bzoj 2244: [SDOI2011]拦截导弹
#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]拦截导弹的更多相关文章
- bzoj 2244: [SDOI2011]拦截导弹 cdq分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 237 Solved: ...
- BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治
2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...
- bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...
- bzoj 2244 [SDOI2011]拦截导弹(dp+CDQ+树状数组)
传送门 题解 看了半天完全没发现这东西和CDQ有什么关系…… 先把原序列翻转,求起来方便 然后把每一个位置表示成$(a,b,c)$其中$a$表示位置,$b$表示高度,$c$表示速度,求有多少个位置$a ...
- BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]
传送门 题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率 $1A$了好开心 首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1] ...
- BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治
三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include < ...
- BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)
题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...
- BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)
题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ...
- BZOJ:2244: [SDOI2011]拦截导弹
问题: printf("%.5f ",0):为什么错了? 注意: 初始值很重要 题解: 三维偏序问题: 记录从前往后最长上升子序列长度pref,条数preg 从后往前suff,su ...
随机推荐
- Connection的使用
package com.cz.test.util.collection; import java.util.ArrayList;import java.util.Collection;import j ...
- 在PC端或移动端应用中接入商业QQ的方法
今天看博友的博客学习了一种很有用的方法: 在页面中需要接入企业的QQ,访问网址:http://shang.qq.com/widget/consult.php.(就是API接口),然后你只需要登录你的Q ...
- JavaWeb学习总结(三)—Servlet
1. 什么是Servlet * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener) ,Servlet是用来处理客户端请求的动态资源,按照一种约定俗成的称呼习惯 ...
- N-Queens II
Description: Follow up for N-Queens problem. Now, instead outputting board configurations, return th ...
- golang json
1.Go语言的JSON 库 Go语言自带的JSON转换库为 encoding/json 1.1)其中把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下 func Mar ...
- [css] 认识margin
原文链接http://www.zhangxinxu.com/wordpress/2009/08/css-margin%E7%9A%84%E7%9B%B8%E5%85%B3%E5%B1%9E%E6%80 ...
- Three.js 3D特效学习
一.Three.js基本介绍 Three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场 ...
- 【服务器防护】VPN的ip变更,导致无法连接服务器,解决方法【阿里云ECS】
在阿里云的管理控制台,云服务器ECS - 对应服务器 - 选“管理” - “连接管理终端” 通过这个入口,可以进入Linux云服务器,修改防火墙限制的IP即可
- Intent 隐式跳转,向下一个活动传递数据,向上一个活动返回数据。
一.每个Intent只能指定一个action,多个Category. 使用隐式跳转,我们不仅可以跳转到自己程序内的活动,还可以启动其他程序的活动.使得Android多个程序之间的功能共享成为可能. 例 ...
- NDK与JNI
什么是NDK(android native develop kits) :android 本地开发工具集,可以把c/c++编译成一个linux下可以执行的二进制文件 java代码里面就可以通过jni ...