BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]
题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率
$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分治 树状数组]的更多相关文章
- bzoj 2244: [SDOI2011]拦截导弹 cdq分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 237 Solved: ...
- BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)
题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ...
- BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治
三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include < ...
- BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
随机推荐
- tree(并查集)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- [高并发]抢红包设计(使用redis)
假设一个需求,在某个预告活动中准备了10w个红包,100w人在某个时间点去开抢,每人只能抢1次,如何保证性能和准确性,下面我给出我的一个设计方案,抛砖引玉 分析瓶颈 查询用户是否已参与过活动 获取一个 ...
- 对SVD奇异值分解的理解
首先推荐一篇博客,奇异值分解(SVD)原理详解及推导 - CSDN博客,讲解的很清楚.这里我谈谈自己的理解,方便以后回顾. 如果把向量理解为空间中的一个元素,那么矩阵可以理解为两个空间上的映射 ...
- 最小生成树之Prim算法
描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来--小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- php网站在服务器上邮件发送不了,在本地可以
标签: php邮箱 2015-11-27 13:58 879人阅读 评论(0) 收藏 举报 分类: php(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做phpmailer发送邮 ...
- 再叙ASM
上一篇文章,我们已体验到ASM的威力,那么结合上面的代码解释ASM是怎么执行的. ClassWriter clazzWriter = new ClassWriter(0); 首先看下官方文档对Clas ...
- CCF系列之日期计算(201509-2)
试题编号: 201509-2 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: ...
- RAC和单节点数据库的区别有哪些?RAC最有用的功能是什么?
区别 (1)RAC有2个以上的实例,单节点只有1个实例 (2)RAC具有实例级别的高可用 (3)实例与实例之间通过内联网络交换数据,单节点不可 (4)RAC每个节点都有自己套SGA.后台进程.redo ...
- c# winform 类似android toast消息功能
先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...