拦截导弹(CDQ分治,DP)
很好的题,值得细细说,(果然又是个假期望).......
首先我们提取信息,显然这是个三维偏序问题
用简单的DP式子表示需要满足
f[i]=max(f[1--j]+1)(v[j]<v[i],h[j]<h[i],j<i)
那么我们发现这样可以愉快的CDQ,方案数用g数组表示,
在树状数组中注意维护就好
void add(int x,int kx,double kxx)
{
for(int i=x;i<=h_tot;i+=lowbit(i))
{
if(kx==c[i])
{
c2[i]+=kxx;
}
else if(kx>c[i])
{
c2[i]=kxx;c[i]=kx;
}
}
}
(注意这里+的方案数,是当前增加的值的方案数)
这样就结束了????
在这里才发现了CDQ优化DP的方法有些不同
我们发现普通的CDQ是将子区间处理完后,才会处理更大的区间
然而这里有一些不同的是,我们并不能一个一个小区间的处理
例如一串数 1 2 3 4 5 6
如果我们先处理左区间1-3在处理右区间4-6,在处理最后
我们发现可能的结果是1-3先更新4,5,
然后4,5更新6,显然这样是满足DP规律的
我们不妨将其看作中序遍历,先左后中后右,这样保证了正确性QAQ
注意:
这样就不能像原来一样保证序列的有序,这样我们牺牲时间
每次处理新区间时,将左右两区间按第二关键字排序一遍
然后处理完后早将这个的大区间按第一关键字排回,这样保证有序
(原来区间从下向上第一关键字当然有序,这时先大区间后小区间就要重新排了)
还有我们要两次扫,因为假设是1-n搜表示以i结尾的最大不上升序列长度
然而我们的i可能卡在中间,那么我们把区间倒转,再将每个a[i]变值(原来小的变成大的),然后只要打一遍CDQ就好了
1 #include<iostream>
2 #include<cstdio>
3 #include<string>
4 #include<algorithm>
5 #include<cmath>
6 #include<vector>
7 #include<map>
8 #include<cstring>
9 #define MAXN 510001
10 #define int long long
11 using namespace std;
12 struct node{int v,h,id;}e[MAXN];
13 int lowbit(int x){return x&(-x);}
14 bool cmp(const node &a,const node &b) {return a.id<b.id;}
15 int h_tot,v_tot;
16 int c[MAXN];
17 double c2[MAXN];
18 int dp[MAXN][3];
19 double g[MAXN][3];
20 int v_old[MAXN],h_old[MAXN];
21 int n;int maxn=0;
22 double geshu=0.0;
23 double ans[MAXN];
24 void add(int x,int kx,double kxx)
25 {
26 for(int i=x;i<=h_tot;i+=lowbit(i))
27 {
28 if(kx==c[i])
29 {
30 c2[i]+=kxx;
31 }
32 else if(kx>c[i])
33 {
34 c2[i]=kxx;c[i]=kx;
35 }
36 }
37 }
38 int query(int x)
39 {
40 int anss=0;
41 for(int i=x;i>=1;i-=lowbit(i))
42 {
43 if(c[i]>anss)
44 {
45 geshu=c2[i];anss=c[i];
46 }
47 else if(c[i]==anss)
48 {
49 geshu+=c2[i];
50 }
51 }
52 return anss;
53 }
54 void clear(int x)
55 {
56 for(int i=x;i<=h_tot;i+=lowbit(i)){c[i]=0;c2[i]=0.0;}
57 }
58 bool cmp_v(const node &a,const node &b)
59 {
60 return (a.v==b.v)?((a.h==b.h)?(a.id<b.id):a.h<b.h):(a.v<b.v);
61 }
62 void work1(int l,int r,int mid,int me)
63 {
64 sort(e+l,e+r+1,cmp_v);
65 for(int i=l;i<=r;++i)
66 {
67 if(e[i].id<=mid)
68 {
69 add(e[i].h,dp[e[i].id][me],g[e[i].id][me]);
70 }
71 else
72 {
73 geshu=0;
74 int ttt=query(e[i].h)+1;
75 if(ttt>dp[e[i].id][me])
76 {
77 dp[e[i].id][me]=ttt;
78 g[e[i].id][me]=geshu;
79 }
80 else if(ttt==dp[e[i].id][me])
81 {
82 g[e[i].id][me]+=geshu;
83 }
84 }
85 }
86 for(int i=l;i<=r;++i)
87 {
88 if(e[i].id<=mid)
89 clear(e[i].h);
90 }
91 sort(e+l,e+r+1,cmp);
92 }
93 void solve(int l,int r,int me)
94 {
95 int mid=(l+r)>>1;
96 if(l==r)return ;
97 solve(l,mid,me);
98 work1(l,r,mid,me);
99 solve(mid+1,r,me);
100 return ;
101 }
102 signed main()
103 {
104 scanf("%lld",&n);
105 for(int i=1;i<=n;++i)
106 {
107 scanf("%lld%lld",&h_old[n-i+1],&v_old[n-i+1]);
108 e[n-i+1].h=h_old[n-i+1];
109 e[n-i+1].v=v_old[n-i+1];
110 e[n-i+1].id=n-i+1;
111 }
112 sort(h_old+1,h_old+n+1);
113 sort(v_old+1,v_old+n+1);
114 h_tot=unique(h_old+1,h_old+n+1)-h_old-1;
115 v_tot=unique(v_old+1,v_old+n+1)-v_old-1;
116 for(int i=1;i<=n;++i)
117 {
118 e[i].h=lower_bound(h_old+1,h_old+h_tot+1,e[i].h)-h_old;
119 e[i].v=lower_bound(v_old+1,v_old+v_tot+1,e[i].v)-v_old;
120 }
121 for(int i=1;i<=n;++i)
122 {
123 dp[e[i].id][1]=1;dp[e[i].id][2]=1;
124 g[e[i].id][1]=1;g[e[i].id][2]=1;
125 }
126 sort(e+1,e+n+1,cmp);
127 solve(1,n,1);
128 /*for(int i=1;i<=n;++i)
129 {
130 printf("dp[%lld][1]=%lld g[%lld][1]=%lld \n",i,dp[i][1],i,g[i][1]);
131 }*/
132 for(int i=1;i<=n;++i)
133 maxn=max(maxn,dp[i][1]);
134 reverse(e+1,e+n+1);
135 for(int i=1;i<=n;++i)
136 {
137 e[i].h=h_tot-e[i].h+1;
138 e[i].v=v_tot-e[i].v+1;
139 e[i].id=i;
140 }
141 solve(1,n,2);
142 double sum=0.0;
143 for(int i=1;i<=n;++i)
144 {
145 if(dp[i][1]==maxn)sum+=g[i][1];
146 }
147 for(int i=1;i<=n;++i)
148 {
149 if(dp[n-i+1][2]+dp[i][1]-1==maxn)
150 {
151 ans[i]=(g[i][1]*g[n-i+1][2])/sum;
152 //printf("ans[%lld]=%.4lf\n",i,ans[i]);
153 }
154 else ans[i]=0.0;
155 }
156 printf("%lld\n",maxn);
157 for(int i=n;i>=1;--i)
158 {
159 printf("%.5lf ",ans[i]);
160 }
161 cout<<endl;
162 }
拦截导弹(CDQ分治,DP)的更多相关文章
- bzoj 2244: [SDOI2011]拦截导弹 cdq分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 237 Solved: ...
- [BZOJ2244][SDOI2011]拦截导弹 CDQ分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MB Special Judge Description 某国为了防御敌国的导弹 ...
- BZOJ2244: [SDOI2011]拦截导弹(CDQ分治,二维LIS,计数)
Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高 ...
- BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)
题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ...
- BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]
传送门 题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率 $1A$了好开心 首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1] ...
- BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治
三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include < ...
- BZOJ 2225: [Spoj 2371]Another Longest Increasing (CDQ分治+dp)
题面 Description 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output ...
- luogu4849 寻找宝藏 (cdq分治+dp)
设f[i]是已经走到i号点的值. 先要给第四维离散化.然后去重 第一维排序,第二维cdq分治,第三维cdq分治,第四维树状数组,找到满足j(x,y,z,w)<=i(x,y,z,w)的j,给i统计 ...
- [BZOJ4700]适者(CDQ分治+DP/李超线段树)
如果没有秒杀,就是经典的国王游戏问题,按t/a从小到大排序即可. 考虑删除两个数i<j能给答案减少的贡献:S[i]*T[i]+P[i-1]*A[i]-A[i]+S[j]*T[j]+P[j-1]* ...
- ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)
问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- Raspberry PI 4B 安装和配置 Raspbian
做记录,以备之后需要,待完成中 目录 做记录,以备之后需要,待完成中 下载镜像和安装程序 ssh 远程访问 下载镜像和安装程序 Raspbian: installer: ssh 远程访问 开启ssh ...
- 初步了解web
------------------------1.Web应用程序的main方法在哪里------------------------Tomcat:从启动到运行首先,我们是通过执行 Tomcat 的s ...
- 2Spring对象创建小结
Spring的对象创建 Spring学习笔记 周芋杉2021/5/15 原理:工厂设计模式,通过反射创建对象. Spring工厂分类 非web环境:ClassPathXmlApplicationCon ...
- [DB] Spark Core (1)
生态 Spark Core:最重要,其中最重要的是RDD(弹性分布式数据集) Spark SQL Spark Streaming Spark MLLib:机器学习算法 Spark Graphx:图计算 ...
- linux查看文件的编码格式的方法 set fileencoding PYTHON
linux查看文件的编码格式的方法 set fileencoding 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp93 ...
- wmctrl像xmonad那样方便地用快捷键来控制任务窗口的显示
窗口左右互搏之wmctrl篇 分类: LINUX 2012-10-24 16:34:41 一直有个念头,就是能够像xmonad那样方便地用快捷键来控制任务窗口的显示,今天弄wmctrl,刚好有时间 ...
- CentOS 6.5新增加硬盘挂载并实现开机自动挂载
Centos7.x请参考:https://www.cnblogs.com/himismad/p/7851548.html 在内网主机Centos 6.5新增一个50G硬盘 (搭建在CAS服务器,直接新 ...
- JavaScript 实现简易版贪吃蛇(Day_13)
时光永远在变迁,你始终要丢下过去. 使用语言 JavaScript 概述 运用JavaScript 实现简易版<贪吃蛇>. Html 页面 1 <!DOCTYPE htm ...
- CAP理论之思考
分布式系统的最大难点就是各个节点如何保持一致.最近我在工作中就遇到这样的问题,不同节点之间,彼此通过API,进行通信,交互数据,但有些服务节点存在延迟等问题,导致我看到的并不是实时的数据,以及系统更新 ...
- python爬取微信小程序(实战篇)
python爬取微信小程序(实战篇) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90452656 展开 一.背景介绍 近期有需求需要抓 ...