问题:

  printf("%.5f ",0):为什么错了?

注意:

  初始值很重要

题解:

三维偏序问题;

记录从前往后最长上升子序列长度pref,条数preg

从后往前suff,sufg

如果对于某个点pref+suff==ans-1,那么打掉它的概率 preg*sufg/tot

Wa了好多次QWQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) x&(-x)
using namespace std;
typedef long long Lint;
const int maxn=3000009; int n;
int ans; double tot;
int pref[maxn];
double preg[maxn];
int suff[maxn];
double sufg[maxn]; struct Missile{
int x,z,y,f;
double g;
}a[maxn]; int b[maxn],nn; int c[maxn];
double d[maxn];
int add(int x,int val,double q){
while(x<=nn){
if(val>c[x]){
c[x]=val;
d[x]=q;
}else if(val==c[x]){
d[x]+=q;
}
x+=lowbit(x);
}
}
int refresh(int x){
while(x<=nn){
c[x]=d[x]=0;
x+=lowbit(x);
}
}
int querymax(int x){
int ret=0;
while(x){
ret=max(ret,c[x]);
x-=lowbit(x);
}
return ret;
}
double querysum(int x,int val){
double ret=0;
while(x){
if(c[x]==val){
ret+=d[x];
}
x-=lowbit(x);
}
return ret;
} int cmpx(const Missile &tmp1,const Missile &tmp2){
return tmp1.x<tmp2.x;
}
int cmpy(const Missile &tmp1,const Missile &tmp2){
if(tmp1.y==tmp2.y)return tmp1.z<tmp2.z;
else return tmp1.y<tmp2.y;
}
int cdq(int l,int r){
if(l==r)return 0;
int mid=(l+r)>>1;
cdq(l,mid);
int t1=l,t2=mid+1;
sort(a+l,a+mid+1,cmpy);
sort(a+mid+1,a+r+1,cmpy);
while(t2<=r){
while((t1<=mid)&&(a[t1].y<=a[t2].y)){
add(a[t1].z,a[t1].f,a[t1].g);
++t1;
}
int tmp=querymax(a[t2].z)+1;
if(tmp>a[t2].f){
a[t2].f=tmp;
a[t2].g=querysum(a[t2].z,tmp-1);
}else if(tmp==a[t2].f){
a[t2].g+=querysum(a[t2].z,tmp-1);
}
++t2;
}
for(int i=l;i<=mid;++i){
refresh(a[i].z);
}
sort(a+mid+1,a+r+1,cmpx);
cdq(mid+1,r);
} int work1(){
for(int i=1;i<=n;++i){
a[i].y=-a[i].y;
a[i].z=nn-a[i].z+1;
a[i].f=a[i].g=1;
}
cdq(1,n);
for(int i=1;i<=n;++i){
ans=max(ans,a[i].f);
pref[a[i].x]=a[i].f;
preg[a[i].x]=a[i].g;
}
for(int i=1;i<=n;++i){
if(a[i].f==ans)tot=tot+a[i].g;
}
}
int work2(){
for(int i=1;i<=n;++i){
a[i].x=-a[i].x;
a[i].y=-a[i].y;
a[i].z=nn-a[i].z+1;
a[i].f=a[i].g=1;
}
sort(a+1,a+1+n,cmpx);
cdq(1,n);
for(int i=1;i<=n;++i){
suff[-a[i].x]=a[i].f;
sufg[-a[i].x]=a[i].g;
}
}
int Getans(){
printf("%d\n",ans);
for(int i=1;i<=n;++i){
if(pref[i]+suff[i]-1==ans){
printf("%.5f ",preg[i]*sufg[i]/tot);
}else{
printf("%d ",0);
}
}
} int minit(){
tot=0;
ans=0;
for(int i=0;i<=n;++i){
d[i]=c[i]=0;
}
} int main(){
// freopen("Misslie.in","r",stdin);
// freopen("Misslie.out","w",stdout); scanf("%d",&n);
minit();
for(int i=1;i<=n;++i){
scanf("%d%d",&a[i].y,&a[i].z);
a[i].x=i;
b[i]=a[i].z;
}
sort(b+1,b+1+n);
nn=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;++i){
a[i].z=lower_bound(b+1,b+1+nn,a[i].z)-b;
} work1();
work2(); Getans();
return 0;
}

  

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]拦截导弹

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

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

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

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

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

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

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

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

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

随机推荐

  1. 「NOIP2016」天天爱跑步

    传送门 Luogu 解题思路 树上差分+桶计数. 我们发现在一条路径上的点 \(i\) ,它可以观测到玩家的条件是: \(i \in (u \to LCA),dep_u=w_i+dep_i\) \(i ...

  2. Python 网络编程之网络协议(未完待续)

    一:网络编程从两大架构开始 1.网络开发的两大架构 c/s 架构 : client  server B/S 架构 : Brower  server (1)bs 和 cs 架构之间的关系? (2)哪一种 ...

  3. hdfs的bug纪录, Unexpected block state

      今早遇到一个bug,提交 spark job 失败.说 hdfs 在 safe mode状态,不允许创建和删除文件. 然后发现 hdfs 的日志文件不断滚动,几乎每秒钟100M的速度打日志,当时没 ...

  4. Docker registry自签名证书

    权威Registry 获取安全证书有两个办法:互联网认证的CA处获取.自建CA自己给自己签名. 1.从认证CA处获取签名证书,大多数是需要付出一定费用的,近些年也有认证CA提供免费证书,例如Let’s ...

  5. ubuntu 下tftp的安装、配置、使用

    背景 一般来说,tftp 服务 可以用来 uboot 下载. 正文 1. 安装 sudo apt-get install tftp-hpa tftpd-hpa -y 2. 配置 sudo vi /et ...

  6. C++字符集和词法记号以及符号常量

    C++字符集 大小写的英文字母:A~Z,a~z 数字符号:0~9 特殊字符:!#%*()等 关键字:C++预定义的单词 标识符:程序员声明的单词,它命名程序正文中的一些实体 文字:在程序中直接使用符号 ...

  7. P1077 互评成绩计算

    P1077 互评成绩计算 转跳点:

  8. 51nod 1444:破坏道路 广度优先搜索

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 在某一个国家,那儿有n个城市,他们通过 ...

  9. 安卓10GB内存旗舰手机的普及,能成为拯救DRAM厂商的救命稻草吗?

    你对2019年手机即将展现出的全新变化,有哪些期待?是全新的处理器.更名副其实的全面屏,还是愈发强大的拍照功能,抑或折叠屏幕?但不管你有怎样的期待,手机厂商似乎总是"不解风情".常 ...

  10. MySQL之表、列别名及各种JOIN连接详解

    MySQL在SQL中,合理的别名可以让SQL更容易以及可读性更高.别名使用as来表示,可以分为表别名和列别名,别名应该是先定义后使用才对,所以首先要了解sql的执行顺序(1) from(2) on(3 ...