拦截导弹(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)
问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- 【实用小技巧】freemarker模板中文乱码问题解决
freemarker简单模板如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content- ...
- Govern EventBus - 历经多年生产环境验证的事件驱动架构框架
Govern EventBus Govern EventBus 是一个历经四年生产环境验证的事件驱动架构框架, 通过事件总线机制来治理微服务间的远程过程调用. 使用本地事务来支持微服务内强一致性,事件 ...
- Python中的迭代器、生成器、装饰器
1. 迭代器 1 """ 2 iterator 3 迭代器协议: 对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIterati ...
- Mybatis学习之自定义持久层框架(五) 自定义持久层框架:封装CRUD操作
前言 上一篇文章我们完成了生产sqlSession的工作,与数据库的连接和创建会话的工作都已完成,今天我们可以来决定会话的内容了. 封装CRUD操作 首先我们需要创建一个SqlSession接口类,在 ...
- python工业互联网应用实战15-前后端分离模式1
我们在13章节里通过监控界面讲了如何使用jquery的动态加载数据写法,通过简单案例来说明了如何实现动态的刷新监控界面的数据,本章我们将演示如何从Django模板加载数据逐步演化到前后端分离的异步数据 ...
- jenkins邮件报警机制配置
1.下载email插件 Jenkins配置email前需要先安装email插件:Email Extension.Email Extension Template Plugin 2.系统配置 在Jenk ...
- jQ的四类基本选择器
jQuery的四种选择器 jQ选择器与css选择器本质上相差不大,但是在使用容易混淆格式或属性 1.基础选择器 $('#id名') $('.类名') $('.类名1 .类名2') $('标签名.类名' ...
- shell基础之shell相关概念
一.脚本介绍 1.脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看.编辑). 常见的脚本: JavaScript(JS,前端),VBScript, ...
- 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...
- Windows上能看朋友圈的微信来了 | 附下载地址
昨天的时候,电脑端的微信提示更新就顺手更新了一下,更新完成后习惯性的点了下设置,纳尼,居然被灰到了测试版本? 带着好奇,赶快看了下更新了什么内容: 支持浏览朋友圈 "搜一搜"支持搜 ...