传送门

题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率


$1A$了好开心

首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1][i]$

我们可以用一些转换来简化代码

反转之后变成$LIS$,然后再反转并且$x,y$取反还是$LIS$,写一遍就可以啦

然后本题的树状数组需要维护最大值以及最大值的数量,还有一个时间戳

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=5e4+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m;
int mp[N];
void iniMP(){
sort(mp+,mp++m);
int p=;
mp[++p]=mp[];
for(int i=;i<=m;i++) if(mp[i]!=mp[i-]) mp[++p]=mp[i];
m=p;
}
int Bin(int v){
int l=,r=m;
while(l<=r){
int mid=(l+r)>>;
if(v==mp[mid]) return mid;
else if(v<mp[mid]) r=mid-;
else l=mid+;
}
return ;
}
int c[N],mark[N],CL;double cnt[N];
inline int lowbit(int x){return x&-x;}
inline void upd(int p,int f,double g){
for(;p<=m;p+=lowbit(p)){
if(mark[p]!=CL) mark[p]=CL,c[p]=f,cnt[p]=g;
else if(c[p]<f) c[p]=f,cnt[p]=g;
else if(c[p]==f) cnt[p]+=g;
}
}
inline void que(int p,int &f,double &g){
for(;p;p-=lowbit(p)) if(mark[p]==CL){
if(c[p]>f) f=c[p],g=cnt[p];
else if(c[p]==f) g+=cnt[p];
}
}
struct Data{
int x,y,id;
}a[N];
int ref[N];
inline bool cmpX(int p,int q){
return a[p].x==a[q].x ? a[p].id<a[q].id : a[p].x<a[q].x;
}
int F[][N];double G[][N];
void CDQ(int l,int r,int tp){
if(l==r) return;
int mid=(l+r)>>;
CDQ(l,mid,tp);
for(int i=l;i<=r;i++) ref[i]=i;
sort(ref+l,ref+r+,cmpX);
int *f=F[tp]; double *g=G[tp];
CL++;
for(int i=l;i<=r;i++){
int _=i;i=ref[i];
if(a[i].id<=mid) upd(a[i].y,f[a[i].id],g[a[i].id]);
else{
int v=;double sum=;que(a[i].y,v,sum);
v++;
if(v>f[a[i].id]) f[a[i].id]=v,g[a[i].id]=sum;
else if(v==f[a[i].id]) g[a[i].id]+=sum;
}
i=_;
}
CDQ(mid+,r,tp);
}
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i].x=read(),mp[++m]=a[i].y=read();
iniMP();
for(int i=;i<=n;i++) a[i].y=Bin(a[i].y);
for(int i=;i<=n;i++) F[][i]=F[][i]=G[][i]=G[][i]=;
reverse(a+,a++n);
for(int i=;i<=n;i++) a[i].id=i;
CDQ(,n,);
//for(int i=1;i<=n;i++) printf("F0 %d %d %d %d %lf\n",i,a[i].x,a[i].y,F[0][i],G[0][i]);
//puts("---");
reverse(a+,a++n);
for(int i=;i<=n;i++) a[i].y=m-a[i].y+,a[i].x=INF-a[i].x,a[i].id=i;
CDQ(,n,);
//for(int i=1;i<=n;i++) printf("F1 %d %d %d %d %lf\n",i,a[i].x,a[i].y,F[1][i],G[1][i]); for(int i=;i<=n/;i++) swap(F[][i],F[][n-i+]),swap(G[][i],G[][n-i+]);
int ans=;double tot=;
for(int i=;i<=n;i++) ans=max(ans,F[][i]);
for(int i=;i<=n;i++) if(F[][i]==ans) tot+=G[][i];//printf("tot %lf\n",tot);
printf("%d\n",ans);
for(int i=;i<=n;i++){
if(F[][i]+F[][i]-!=ans) printf("%.5lf ",0.0);
else printf("%.5lf ",G[][i]*G[][i]/tot);
}
}

BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]的更多相关文章

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

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

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

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

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

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

  4. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  5. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

  6. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  7. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  8. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  9. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

随机推荐

  1. linux基本命令学习01

    =============================================================================Unix/Linux最主要的应用领域是基础服务 ...

  2. c++(数据选择)

    在数学中,有一些数据选择的内容.举个例子来说,有这样一组数据:1.2.3.4.现在我们打算从中挑选出1个数据,那么有几种选择呢?结果应该是1.2.3.4:那么如果挑选2个数据呢,怎么选呢?那么结果应该 ...

  3. Sass的四种编译方式

    我们都知道Sass其实有两种,一种是Sass,一种是SCSS. Sass 和 SCSS 其实是同一种东西,我们平时都称之为 Sass,两者之间不同之处有以下两点: 文件扩展名不同,Sass 是以“.s ...

  4. 转:绝对干货--WordPress自定义查询wp_query所有参数详细注释

    <?php /** * WordPress 查询综合参考 * 编译:luetkemj - luetkemj.com * * 官方文档: http://codex.wordpress.org/Cl ...

  5. reduceByKeyLocally

    2017年3月15日, 星期三 reduceByKeyLocally--Transformation类算子 代码示例  

  6. PHPCMS模板里面使用自定义函数

    首先我在/phpcms/libs/functions/extention.func.php里面新增了一个函数 ============================================= ...

  7. web前端学习(2):开始编写HTML

    在第一章中,我们初步了解了上网的过程,同时也明白了所谓网页,其本质就是主要用HTML语言所写的一份文档.相信大多数人在了解HTML文件前,最先接触的是利用"记事本"所写的文档或者是 ...

  8. 如何 Scale Up/Down Deployment?- 每天5分钟玩转 Docker 容器技术(126)

    伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数.Deployment nginx-deployment 初始是两个副本. k8s-node1 和 k8s-node2 上各跑了一 ...

  9. mysql-SQL优化总结

    1.查询首先考虑在where和order by设计的列上建立索引,尽量避免全表扫描. 2.尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描. select ...

  10. 一种CListCtrl自绘效果