日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】

發布時間:2025/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

某國為了防御敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度、并且能夠攔截任意速度的導彈,但是以后每一發炮彈都不能高于前一發的高度,其攔截的導彈的飛行速度也不能大于前一發。某天,雷達捕捉到敵國的導彈來襲。由于該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
在不能攔截所有的導彈的情況下,我們當然要選擇使國家損失最小、也就是攔截導彈的數量最多的方案。但是攔截導彈數量的最多的方案有可能有多個,如果有多個最優方案,那么我們會隨機選取一個作為最終的攔截導彈行動藍圖。
我方間諜已經獲取了所有敵軍導彈的高度和速度,你的任務是計算出在執行上述決策時,每枚導彈被攔截掉的概率。

輸入格式

第一行包含一個正整數n,表示敵軍導彈數量;
下面 行按順序給出了敵軍所有導彈信息:
第i+1行包含2個正整數hi和vi,分別表示第 枚導彈的高度和速度。

輸出格式

輸出包含兩行。
第一行為一個正整數,表示最多能攔截掉的導彈數量;
第二行包含n個0到1之間的實數,第i個數字表示第i枚導彈被攔截掉的概率(你可以保留任意多位有效數字)。

輸入樣例

4

3 30

4 40

6 60

3 30

輸出樣例

2

0.33333 0.33333 0.33333 1.00000

提示

對于100%的數據,1≤n≤5*104, 1≤hi ,vi≤109;

均勻分布著約30%的數據,所有vi均相等。

均勻分布著約50%的數據,滿足1≤hi ,vi≤1000。

題解

二維LIS
考慮cdq分治,套上樹狀數組可以得到答案

但是要算概率就有些麻煩了
先要算出總方案數,計算過程中記錄,最后最大值的地方方案數之和就是總方案數

至于每個點有多少方案經過
我們反著再做一次LIS,這樣一個點往前往后之和 - 1如果等于答案,那么就將往前往后方案數乘起來就是總的方案數

碼著真tm累

#include<iostream> #include<cstdio> #include<cmath> #include<map> #include<cstring> #include<algorithm> #define LL long long int #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define REP(i,n) for (int i = 1; i <= (n); i++) #define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts(""); #define lbt(x) (x & -x) #define mp(a,b) make_pair<double,double>(a,b) #define cp pair<double,double> using namespace std; const int maxn = 50005,maxm = 100005,INF = 1000000000; inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag; } struct node{int t,x,y; double f[2],g[2];}e[maxn],t[maxn]; inline bool operator <(const node& a,const node& b){return a.x == b.x ? a.y < b.y : a.x < b.x; } inline bool cmp(const node& a,const node& b){return a.t < b.t; } int b[maxn],tot,c[maxn],tt; int getx(int x){return lower_bound(b + 1,b + 1 + tot,x) - b;} int gety(int x){return lower_bound(c + 1,c + 1 + tt,x) - c;} int n; double mx[maxn],sum[maxn]; void upd(int u,double v,double s){while (u <= tt){if (v > mx[u]){mx[u] = v;sum[u] = s;}else if (v == mx[u])sum[u] += s;u += lbt(u);} } cp query(int u){cp re = mp(0,0);while (u){if (mx[u] > re.first){re.first = mx[u];re.second = sum[u];}else if (mx[u] == re.first)re.second += sum[u];u -= lbt(u);}return re; } void cls(int u){while (u <= tt){sum[u] = mx[u] = 0;u += lbt(u);} } void init(){n = read();for (int i = 1; i <= n; i++){e[i].t = i;e[i].x = b[i] = read();e[i].y = c[i] = read();}sort(b + 1,b + 1 + n);sort(c + 1,c + 1 + n);tot = tt = 1;for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];for (int i = 2; i <= n; i++) if (c[i] != c[tt]) c[++tt] = c[i];for (int i = 1; i <= n; i++){e[i].x = getx(e[i].x);e[i].y = gety(e[i].y);} } void cdq(int l,int r,int p){if (l == r){if (!e[l].f[p]) e[l].f[p] = e[l].g[p] = 1;return;}int mid = l + r >> 1,li = l,ri = mid + 1;for (int i = l; i <= r; i++){if (e[i].t <= mid) t[li++] = e[i];else t[ri++] = e[i];}for (int i = l; i <= r; i++) e[i] = t[i];cdq(l,mid,p);sort(e + l,e + mid + 1);cp tmp; li = l; ri = mid + 1;while (li <= mid && ri <= r){if (e[li].x <= e[ri].x) upd(e[li].y,e[li].f[p],e[li].g[p]),li++;else {tmp = query(e[ri].y);if (!tmp.first) {ri++; continue;}if (tmp.first + 1 > e[ri].f[p]){e[ri].f[p] = tmp.first + 1;e[ri].g[p] = tmp.second;}else if (tmp.first + 1 == e[ri].f[p]){e[ri].g[p] += tmp.second;}ri++;}}while (ri <= r){tmp = query(e[ri].y);if (!tmp.first) {ri++; continue;}if (tmp.first + 1 > e[ri].f[p]){e[ri].f[p] = tmp.first + 1;e[ri].g[p] = tmp.second;}else if (tmp.first + 1 == e[ri].f[p]){e[ri].g[p] += tmp.second;}ri++;}for (int i = l; i < li; i++) cls(e[i].y);cdq(mid + 1,r,p); } void solve(){for (int i = 1; i <= n; i++){e[i].x = tot - e[i].x + 1;e[i].y = tt - e[i].y + 1;}sort(e + 1,e + 1 + n);cdq(1,n,0);for (int i = 1; i <= n; i++){e[i].x = tot - e[i].x + 1;e[i].y = tt - e[i].y + 1;e[i].t = n - e[i].t + 1;}sort(e + 1,e + 1 + n);cdq(1,n,1);for (int i = 1; i <= n; i++) e[i].t = n - e[i].t + 1;sort(e + 1,e + 1 + n,cmp);double ans = 0,sum = 0;for (int i = 1; i <= n; i++){if (e[i].f[0] > ans){ans = e[i].f[0];sum = e[i].g[0];}else if (e[i].f[0] == ans){sum += e[i].g[0];}}printf("%.lf\n",ans);for (int i = 1; i <= n; i++){if (e[i].f[0] + e[i].f[1] - 1 < ans) printf("0 ");else printf("%.6lf ",e[i].g[0] * e[i].g[1] / sum);} } int main(){init();solve();return 0; }

轉載于:https://www.cnblogs.com/Mychael/p/8580956.html

總結

以上是生活随笔為你收集整理的BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97一级片| 亚洲AV乱码国产精品观看麻豆 | 久久久久国色av免费观看性色 | 北条麻妃在线一区 | 国产一区二区三区高清 | av在线日韩| 五月婷婷色丁香 | 你操综合 | 亚洲av人无码激艳猛片服务器 | 成年人晚上看的视频 | 九九九久久久久 | 喷水av | 8x8ⅹ国产精品一区二区 | 国产精品99久久久久久久 | 成人午夜精品福利 | 久久高清内射无套 | 大学生一级一片全黄 | 亚洲欧美黄色片 | 黄色a站| 国产成人精品一区二区三区福利 | 波多野吉衣一区二区三区 | av观看在线免费 | 精品久久福利 | 18xxxx日本| 亚洲一区二区三区久久久 | 色综合激情| 国产精品日日夜夜 | 国产免费自拍 | 中国一级黄色大片 | 日本在线www | 国产精品一区二区三区久久久 | 91中出 | 久久人人人 | 国产刺激高潮av | 国产精品久久久久久久久久久久午夜片 | 国产精品v欧美精品v日韩 | 久久人人超碰 | 一级片99 | 色六月婷婷 | 亚洲精品欧美在线 | 榴莲视频黄色 | 国产午夜在线观看 | 性感美女福利视频 | 国产精品免费无遮挡无码永久视频 | 日韩精彩视频 | 自拍偷拍色图 | 精精国产xxxx视频在线播放 | 国产手机在线播放 | 无码人妻丰满熟妇区毛片18 | 欧美大片免费播放器 | 91秘密入口 | 亚洲av不卡一区二区 | 求av网址 | 天堂av.com| 国产午夜一区 | 关之琳三级全黄做爰在线观看 | 超碰97在线播放 | 成人自拍视频在线观看 | 日本熟妇色xxxxx日本免费看 | 免费一区二区三区视频在线 | 插久久 | 日韩欧美一区二区在线 | 国产精品久久久久不卡 | 亚洲综合二区 | 成人免费va视频 | 欧美激情国产日韩精品一区18 | 99riav1国产精品视频 | 久久久88| 中文字幕精品一二三四五六七八 | 精品一性一色一乱农村 | 国产一区二区三区18 | 日本后进式猛烈xx00动态图 | 国产91久久精品一区二区 | 欧美一区二区久久 | 中国一级片黄色一级片黄 | 中文字幕三级视频 | 亚洲男人天堂视频 | 在线播放一区 | 不卡中文av| 在线观看你懂的网站 | 意大利性荡欲xxxxxx | av作品在线 | 色综合一区二区 | 午夜桃色 | 性大片潘金莲裸体 | 国产69精品久久久久久 | 日日骚一区 | 成人综合站 | 精品人妻大屁股白浆无码 | 国产激情小视频 | 国产视频精品一区二区三区 | www超碰在线 | 污污视频在线免费看 | 国产精品国语对白 | 制服丝袜av一区二区三区下载 | 97免费在线观看视频 | 天堂欧美城网站 | 激情五月色综合国产精品 | 中国毛片网 |