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 ...
随机推荐
- Spring学习日志之Glance
Spring的本质 Spring最根本的意图只有一个:简化Java开发 Spring的核心主要有两个: 依赖注入 AOP Spring容器 Spring容器负责对对象进行创建,装配,配置并管理它们的整 ...
- Spark环境搭建(下)——Spark安装
1. 下载Spark 1.1 官网下载Spark http://spark.apache.org/downloads.html 打开上述链接,进入到下图,点击红框下载Spark-2.2.0-bin-h ...
- Spark算子--filter
filter--Transformation类算子 代码示例 result
- mysql查看表大小
mysql查看表大小 一:命令 show table status like 'table_name'\G; mysql> show table status like 'x'\G; . row ...
- 前端HTML介绍
一.HTML简介 HTML定义: 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加 ...
- linux workqueue的名字长度小问题
在排查一个nvme的的workqueue的问题的时候,发现nvme的queue的进程名被截断了, [root@localhost caq]# ps -ef |grep -i nvme root : ? ...
- js 原型 对象篇
一切皆对象 js中 值类型就不是对象 剩下的都是对象(也就是引用类型) typeof()运算符 判断四种值类型 typeof 10; --> Number || typeof &quo ...
- Traits技法
扮演"特性萃取机"角色,萃取各个迭代器的特性(迭代器的相应类型) 模板特例化:提供一份template定义式,而其本身仍为templatization 通过class templa ...
- Linux指令--watch,at
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...
- CSS--开篇
1,什么是CSS? 层叠样式表(Cascading Style Sheet ),定义了如何显示HTML元素,用来控制网页的样式和布局. 引入CSS后:HTML标记专门用于定义网页的内容,而使用CSS来 ...