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 ...
随机推荐
- ThinkPHP3.2基础知识(二)
1.单入口模式的好处: 安全,灵活.可集中进行安全处理,访问统计等统一控制. 2.入口文件中为什么要判断PHP版本,TP要求PHP的版本是什么? 因为ThinkPHP3.2版本只能在PHP版本5.3. ...
- Spider_Man_3 の selenium
一:介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...
- docker运行dubbo-admin
一:简介 dubbo-admin是dubbo框架的管理平台. 二: 创建继续镜像 Dockerfile FROM fangjipu/jdk8:8 RUN yum -y install epel-rel ...
- input[type=file]中使用ajaxSubmit来图片上传
今天在使用input[type=file]上传图片到服务器时,因为项目要求,并不是像常见的通过按钮来提交表单事件,而是图片上传后就自动执行表单提交事件,将上传的图片信息传给服务器. 刚开始我是这样执行 ...
- win7彻底卸载iis
https://jingyan.baidu.com/article/e5c39bf5829e8e39d660336c.html 昨天在电脑上搭建了PHP开发环境之后,重启apache服务器老是报错,检 ...
- php中使用head进行二进制流输出,让用户下载PDF等附件的方法
http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...
- dede标签:定义文件夹
相关函数: 文件\include\taglib\arclist.lib.php第7行 function lib_arclist(&$ctag,&$refObj)
- C#编写影院售票系统(A project with a higher amount of gold )
项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...
- Django将request对象传入模板配置
对于很多时候,需要从模板中获取很请求中很多内容,比如当前请求的url,当前的session变量中的某个值,这时候我们可以通过配置可将request对象传递进模板. django1.10版本: sett ...
- Android_基础控件
目录 一.文本控件TextView 二.按钮控件Button 三.图片控件ImageView 四.输入控件EditText 一.文本控件TextView 1.布局文件 <TextView and ...