传送门

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


$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. ubuntu下使用nginx搭建流媒体服务器,实现视频点播

    首先我们看如何实现视频点播,视频点播支持flv文件及H264编码视频,ACC编码音频的mp4文件: 第一步,创建单独的目录(因为软件较多,容易混乱),下载需要的软件: 我们需要下载nginx,pcre ...

  2. JqGrid 多行表头设置

    1.我想要统计的效果是这样的 2.只要在初始化表格中加上如下代码就可以了: jQuery("#tbAbroadStatisticByUnit").jqGrid('setGroupH ...

  3. python列表二

    比如说要交换两个的顺序,用中间变量temp即可,和java的方法一样 >>> mix[1, '小尹', 5, '小虎', 3.5, [1, 2, 2], '葫芦娃', 0, '1', ...

  4. Eclipse安装svn插件的几种方式 转帖....

    Eclipse安装svn插件的几种方式 1.在线安装: (1).点击 Help --> Install New Software... (2).在弹出的窗口中点击add按钮,输入Name(任意) ...

  5. vue实现侧边栏手风琴效果

    模板 代码如下 html <template> <div class="header"> <ul> <!-- 循环数据在点击调用chang ...

  6. JPQL

    JPQL语言 JPQL语言,即 Java Persistence Query Language 的简称. JPQL是一种和 SQL 非常类似的中间性和对象化查询语言, 它最终会被编译成针对不同底层数据 ...

  7. AD转换

    一.AD转换的概念  AD转换的功能是把模拟量电压转换为数字量电压.DA转换的功能正好相反,就是讲数字量转换位模拟量. 二.芯片PCF8591介绍 PCF8591是一个单片集成.单独供电.低功耗.8- ...

  8. hbase性能调优_表设计案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  9. reduceByKeyLocally

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

  10. Oracle:控制语句 IF..ELSIF语句、CASE语句、FOR循环语句

    --多重if语句(注意点:BEGIN END ,IF 条件 THEN,ELSIF 条件 THEN,ELSE... END IF)BEGIN IF FALSE THEN DBMS_OUTPUT.put_ ...