bzoj 2244: [SDOI2011]拦截导弹 cdq分治
2244: [SDOI2011]拦截导弹
Time Limit: 30 Sec Memory Limit: 512 MBSec Special Judge
Submit: 237 Solved: 103
[Submit][Status][Discuss]
Description
某
国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导
弹,但是以后每一发炮弹都不能高于前一发的高度,其拦截的导弹的飞行速度也不能大于前一发。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所
以只有一套系统,因此有可能不能拦截所有的导弹。
在不能拦截所有的导弹的情况下,我们当然要选择使国家损失最小、也就是拦截导弹的数量最多的方案。但是拦截导弹数量的最多的方案有可能有多个,如果有多个最优方案,那么我们会随机选取一个作为最终的拦截导弹行动蓝图。
我方间谍已经获取了所有敌军导弹的高度和速度,你的任务是计算出在执行上述决策时,每枚导弹被拦截掉的概率。
Input
第一行包含一个正整数n,表示敌军导弹数量;
下面行按顺序给出了敌军所有导弹信息:
第i+1行包含2个正整数hi和vi,分别表示第枚导弹的高度和速度。
Output
输出包含两行。
第一行为一个正整数,表示最多能拦截掉的导弹数量;
第二行包含n个0到1之间的实数,第i个数字表示第i枚导弹被拦截掉的概率(你可以保留任意多位有效数字)。
Sample Input
3 30
4 40
6 60
3 30
Sample Output
0.33333 0.33333 0.33333 1.00000
【数据规模和约定】
对于100%的数据,1≤n≤5*104, 1≤hi ,vi≤109;
均匀分布着约30%的数据,所有vi均相等。
均匀分布着约50%的数据,满足1≤hi ,vi≤1000。
HINT
鸣谢kac提供sj程序!
这次算是把cdq分治给搞懂了。这道题的做法网上的题解说的已经比较详细了,这里就不重复了。
值得注意的是,随机选择最优方案和沿着最优方案等概率向后走是两个完全不同的东西,后者还要复杂一些,要正扫反扫正扫三遍分治,然而我居然写的就是那个。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define MAXN 100000
- #define MAXT MAXN*4
- #define lch (now<<1)
- #define rch (now<<1^1)
- #define smid ((l+r)>>1)
- #define INF 0x3f3f3f3f
- typedef double real;
- struct aaa
- {
- aaa(){}
- aaa(int x,int y,int id):x(x),y(y),id(id){}
- int x,y;
- int id;
- }al[MAXN];
- bool cmp_x(aaa a1,aaa a2)
- {
- return a1.x<a2.x;
- }
- bool cmp_y(aaa a1,aaa a2)
- {
- return a1.y<a2.y;
- }
- bool cmp_id(aaa a1,aaa a2)
- {
- return a1.id<a2.id;
- }
- struct bbb
- {
- int id;
- int opt;
- int x,y,pos;
- int d;
- //opt==1(Modify (x,y) [+/-])
- //opt==2(Query [x,y] into z[+/-]);
- }bl[MAXN],cl[MAXN];
- bool cmp_bbb_x(bbb b1,bbb b2)
- {
- if (b1.x==b2.x)return b1.opt<b2.opt;
- return b1.x<b2.x;
- }
- bool cmp_bbb_x2(bbb b1,bbb b2)
- {
- if (b1.x==b2.x)return b1.opt<b2.opt;
- return b1.x>b2.x;
- }
- bool cmp_bbb_id(bbb b1,bbb b2)
- {
- return b1.id<b2.id;
- }
- int totb=;
- int totnxt[MAXN];
- int maxx,maxy;
- pair<int,real> dpv[MAXN],dpv2[MAXN];
- template<typename T> pair<int,T> deal(pair<int,T> p1,pair<int,T> p2)
- {
- if (p1.first==p2.first)
- return make_pair(p1.first,p1.second+p2.second);
- else if (p1.first<p2.first)
- return p2;
- else
- return p1;
- }
- bool rev;
- pair<int,real> tarr[MAXN];
- void Add_tarr(int pos,pair<int,real> pr)
- {
- if (rev)pos=maxy+-pos;
- while (pos<MAXN)
- {
- tarr[pos]=deal(tarr[pos],pr);
- pos+=pos&(-pos);
- }
- }
- void Clear_tarr(int pos)
- {
- if (rev)pos=maxy+-pos;
- while (pos<MAXN)
- {
- tarr[pos]=make_pair(,);
- pos+=pos&(-pos);
- }
- }
- pair<int,real> Qry_tarr(int pos)
- {
- if (rev)pos=maxy+-pos;
- pair<int,real> ret=make_pair(-INF,);
- while (pos)
- {
- ret=deal(ret,tarr[pos]);
- pos-=pos&(-pos);
- }
- return ret;
- }
- void solve(int l,int r)
- {
- if (l==r)return ;
- int mid=(l+r)>>;
- solve(l,mid);
- int totc=;
- for (int i=l;i<=mid;i++)
- if (bl[i].opt==)
- cl[totc++]=bl[i];
- for (int i=mid+;i<=r;i++)
- if (bl[i].opt==)
- cl[totc++]=bl[i];
- if (rev)
- sort(cl,cl+totc,cmp_bbb_x2);
- else
- sort(cl,cl+totc,cmp_bbb_x);
- for (int i=;i<totc;i++)
- {
- if (cl[i].opt==)
- {
- Add_tarr(cl[i].y,dpv[cl[i].pos]);
- }else if (cl[i].opt==)
- {
- pair<int,real> res=Qry_tarr(cl[i].y);
- res.first++;
- dpv[cl[i].pos]=deal(dpv[cl[i].pos],res);
- }
- }
- for (int i=;i<totc;i++)
- {
- if (cl[i].opt==)
- {
- Clear_tarr(cl[i].y);
- }
- }
- sort(bl+l,bl+r+,cmp_bbb_id);
- solve(mid+,r);
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- int n,m,x,y,z;
- scanf("%d",&n);
- al[]=aaa(INF/,INF/,);
- for (int i=;i<=n;i++)
- {
- scanf("%d%d",&al[i].x,&al[i].y);
- al[i].id=i;
- }
- n++;
- al[n]=aaa(-INF/,-INF/,n);n++;
- sort(al,al+n,cmp_x);
- x=-INF;y=;
- for (int i=;i<n;i++)
- {
- if (al[i].x!=x)y++;
- x=al[i].x;
- al[i].x=y;
- }
- maxx=y;
- sort(al,al+n,cmp_y);
- x=-INF,y=;
- for (int i=;i<n;i++)
- {
- if (al[i].y!=x)y++;
- x=al[i].y;
- al[i].y=y;
- }
- maxy=y;
- sort(al,al+n,cmp_id);
- //====================================
- totb=;
- for (int i=n-;i>=;i--)
- {
- bl[totb].opt=;
- bl[totb].x=al[i].x;
- bl[totb].y=al[i].y;
- bl[totb].pos=i;
- bl[totb].d=;
- bl[totb].id=totb;
- totb++;
- bl[totb].opt=;
- bl[totb].x=al[i].x;
- bl[totb].y=al[i].y;
- bl[totb].pos=i;
- bl[totb].id=totb;
- totb++;
- }
- dpv[n-]=make_pair(,);
- solve(,totb-);
- //for (int i=0;i<n;i++)printf("%d %.2lf\n",dpv[i].first,dpv[i].second);
- memcpy(dpv2,dpv,sizeof(dpv));
- memset(dpv,,sizeof(dpv2));
- totb=;
- for (int i=;i<n;i++)
- {
- bl[totb].opt=;
- bl[totb].x=al[i].x;
- bl[totb].y=al[i].y;
- bl[totb].pos=i;
- bl[totb].id=totb;
- totb++;
- bl[totb].opt=;
- bl[totb].x=al[i].x;
- bl[totb].y=al[i].y;
- bl[totb].pos=i;
- bl[totb].id=totb;
- totb++;
- }
- dpv[]=make_pair(,);
- rev=true;
- solve(,totb-);
- //for (int i=0;i<n;i++)printf("%d %.2lf\n",dpv[i].first,dpv[i].second);
- printf("%d\n",dpv[n-].first-);
- for (int i=;i<n-;i++)
- if (dpv[i].first+dpv2[i].first!=dpv[n-].first)
- printf("%.5lf ",0.0);
- else
- printf("%.5lf ",dpv[i].second*dpv2[i].second/dpv[n-].second);
- }
bzoj 2244: [SDOI2011]拦截导弹 cdq分治的更多相关文章
- 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 2244: [SDOI2011]拦截导弹 DP+CDQ分治
2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...
- [BZOJ2244][SDOI2011]拦截导弹 CDQ分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MB Special Judge Description 某国为了防御敌国的导弹 ...
- bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...
- BZOJ2244: [SDOI2011]拦截导弹(CDQ分治,二维LIS,计数)
Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高 ...
- bzoj 2244: [SDOI2011]拦截导弹
#include<cstdio> #include<iostream> #include<algorithm> #define M 100009 using nam ...
- bzoj 2244 [SDOI2011]拦截导弹(dp+CDQ+树状数组)
传送门 题解 看了半天完全没发现这东西和CDQ有什么关系…… 先把原序列翻转,求起来方便 然后把每一个位置表示成$(a,b,c)$其中$a$表示位置,$b$表示高度,$c$表示速度,求有多少个位置$a ...
随机推荐
- [转] Spring - Java Based Configuration
PS: Spring boot注解,Configuration是生成一个config对象,@Bean指定对应的函数返回的是Bean对象,相当于XML定义,ConfigurationProperties ...
- 选择 GCD 还是 NSTimer ?
我们常常会延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. 延迟操作的方案一般有三种: 1.NSObject的方法: 2.使用NSTimer的方法: 3 ...
- Foundation: NSNotificationCenter
一个NSNotificationCenter对象(通知中心)提供了在程序中广播消息的机制,它实质上就是一个通知分发表.这个分发表负责维护为各个通知注册的观察者,并在通知到达时,去查找相应的观察者,将通 ...
- Java基础知识强化之IO流笔记56:IO流练习之 登录注册IO版
1. 登录注册IO版的Java项目框架,如下: 2. 具体代码实现: (1)User.java(cn.itcast.game): package cn.itcast.pojo; /** * 这是用户 ...
- Unity3D 之3D游戏SD快打 3D游戏基础入门开发全(1)
这里记录一个U3D游戏,3D游戏的基本开发. 导入素材 1.首先导入需要的素材.因为FBX格式的素材是通用的,所以尽量导入这样的资源使用 导入后的结果: 然后对人形骨骼进行设置. 看哪里没有映射到骨骼 ...
- T-SQL基础 (存储过程,触发器|| 笔记0808)
一:存储过程 1.使用EXEC 调用存储过程 2.系统存储过程是以SP_开头,SP_ProcedureName.:例子:EXEC sp_columns TableName 查看列信息 扩展存储过程 ...
- php模板引擎
http://baike.baidu.com/link?url=HmXfdJBv3zpCdnZPeaSmZmqDBHlyTBnz9Rmb5it-jf1_NLHfaku6_i8ssUYbnaTQEBD4 ...
- linq 多条件查询 where 拼接+分页
首先定义一个静态类 public static class QueryAssembly { /// <summary> /// 返回true /// </summary> // ...
- iOS 获取当前媒体音量
#import <AVFoundation/AVAudioSession.h> AVAudioSession *audioSession = [AVAudioSession sharedI ...
- Less 官方文档学习笔记
LESS 是css的一种扩展,它的编辑器是基于node.js 的less.js,将less文件编译成css文件(可压缩). 其中的概念: 变量:定义变量来代替某个值,只能编译一次,本质是“常量”.例如 ...