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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BZOJ - 2244 攔截導彈 (dp,CDQ分治+樹狀數組優化)

1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #define MAXN 50010 6 #define LL long long 7 using namespace std; 8 struct ddd 9 { 10 int t,h,v,ans; 11 #define t(x) a[x].t 12 #define h(x) a[x].h 13 #define v(x) a[x].v 14 #define ans(x) a[x].ans 15 }a[MAXN]; 16 int n,th[MAXN],tv[MAXN]; 17 bool cmp1(ddd a,ddd b){return a.t==b.t?(a.h==b.h?(a.v<b.v):a.h<b.h):a.t<b.t;} 18 bool cmp2(ddd a,ddd b){return a.h==b.h?(a.t==b.t?(a.v>b.v):a.t<b.t):a.h>b.h;} 19 int ans=1; 20 int C[MAXN]; 21 #define lowbit(x) ((x)&(-(x))) 22 //void add(int x,int y){while(x<=n){C[x]+=y;x+=lowbit(x);}} 23 //int ask(int x){int ans=0;while(x){ans+=C[x];x-=lowbit(x);}return ans;} 24 void add(int x,int y) 25 {//cout<<"add "<<x<<" "<<y<<endl; 26 while(x){C[x]=max(C[x],y);x-=lowbit(x);}} 27 void admin(int x,int y) 28 {while(x){C[x]=min(C[x],y);x-=lowbit(x);}} 29 int ask(int x){int ans=0;while(x<=n){ans=max(ans,C[x]);x+=lowbit(x);}return ans;} 30 void CDQ(int l,int r) 31 { 32 if(l==r){return;} 33 int mid=(l+r)>>1; 34 // sort(a+l,a+mid+1,cmp1); 35 CDQ(l,mid); 36 sort(a+l,a+mid+1,cmp2); 37 sort(a+mid+1,a+r+1,cmp2); 38 int j=l; 39 // cout<<"# "<<l<<" "<<r<<endl; 40 // for(int i=l;i<=r;i++)cout<<i<<": "<<t(i)<<" "<<h(i)<<" "<<v(i)<<endl; 41 for(int i=mid+1;i<=r;i++) 42 { 43 while(j<=mid&&h(j)>=h(i)){//cout<<"!!!!!!!!j "<<j<<" "<<ans(j)<<endl; 44 add(v(j),ans(j)),j++;} 45 ans(i)=max(ans(i),ask(v(i))+1);//cout<<"!!!!!!!!!!ans "<<i<<" "<<ans(i)<<endl; 46 } 47 for(int i=l;i<j;i++)admin(v(i),0); 48 sort(a+mid+1,a+r+1,cmp1); 49 CDQ(mid+1,r); 50 } 51 signed main() 52 { 53 // freopen("in.txt","r",stdin); 54 55 cin>>n; 56 for(int i=1;i<=n;i++) 57 cin>>h(i)>>v(i),t(i)=i,th[i]=h(i),tv[i]=v(i); 58 sort(th+1,th+n+1); 59 sort(tv+1,tv+n+1); 60 int len1=unique(th+1,th+n+1)-th-1; 61 int len2=unique(tv+1,tv+n+1)-tv-1; 62 for(int i=1;i<=n;i++) 63 h(i)=lower_bound(th+1,th+len1+1,h(i))-th, 64 v(i)=lower_bound(tv+1,tv+len2+1,v(i))-tv; 65 sort(a+1,a+n+1,cmp1); 66 for(int i=1;i<=n;i++)ans(i)=1; 67 CDQ(1,n); 68 sort(a+1,a+n+1,cmp1); 69 // for(int i=1;i<=n;i++)cout<<"ans "<<i<<" "<<ans(i)<<endl; 70 for(int i=1;i<=n;i++)ans=max(ans,ans(i)); 71 printf("%d\n",ans); 72 for(int i=1;i<=n;i++) cout<<(double)1/3<<" ";puts(""); 73 } 第一問

先說第一問吧,本來覺得挺簡單的,做起來才發現一直調不出來……第一問其實是一個比較容易看出來的三位偏序問題,只不過并不是簡單的求和,而是用一個點前面h和v都大于他的點答案的最大值+1去更新這個點,所以樹狀數組要維護后綴,記得要把每個點的初始答案附成1。

第二問就比較麻煩了,一個點出現的概率等于$\frac{包含這個點的方案數}{總方案數}$,維護4個數組,f[i]表示以i為結尾的最大長度,g[i]表示以i為結尾最大長度的方案數,h[i]表示以i開頭的最大長度,s[i]表示以i開頭最大長度的方案數。兩個要跑兩邊CDQ,這里之說第一遍,用樹狀數組維護后綴最大值及其方案數(用結構體或pair實現),CDQ時先遞歸處理左區間,然后考慮當前區間,最后遞歸處理右區間。至于答案的更新:

if(tem.maxn==f(i))g(i)+=tem.num;else if(tem.maxn>f(i))f(i)=tem.maxn,g(i)=tem.num;

?還有幾點要注意:如果一個點不能包含在最長子序列中,那么選中他的概率為0。記得開double,這道題會爆longlong。

1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #define MAXN 50010 7 #define LL long long 8 #define int LL 9 using namespace std; 10 struct ddd 11 { 12 int t,h,v,ans; 13 double f,g,he,s; 14 #define t(x) a[x].t 15 #define h(x) a[x].h 16 #define v(x) a[x].v 17 #define ans(x) a[x].ans 18 #define f(x) a[x].f 19 #define g(x) a[x].g 20 #define he(x) a[x].he 21 #define s(x) a[x].s 22 }a[MAXN]; 23 int n,th[MAXN],tv[MAXN]; 24 bool cmp1(ddd a,ddd b){return a.t==b.t?(a.h==b.h?(a.v<b.v):a.h<b.h):a.t<b.t;} 25 bool cmp2(ddd a,ddd b){return a.h==b.h?(a.t==b.t?(a.v>b.v):a.t<b.t):a.h>b.h;} 26 bool cmp3(ddd a,ddd b){return a.t==b.t?(a.h==b.h?(a.v<b.v):a.h<b.h):a.t>b.t;} 27 bool cmp4(ddd a,ddd b){return a.h==b.h?(a.t==b.t?(a.v<b.v):a.t<b.t):a.h<b.h;} 28 double ans=1; 29 #define lowbit(x) ((x)&(-(x))) 30 struct cc{double maxn;double num;}C[MAXN]; 31 void add(int x,double y,double nu) 32 { 33 while(x) 34 { 35 if(C[x].maxn==y)C[x].num+=nu; 36 else if(C[x].maxn<y)C[x].maxn=y,C[x].num=nu; 37 x-=lowbit(x); 38 } 39 } 40 void admin(int x) 41 {while(x){C[x].maxn=C[x].num=0;x-=lowbit(x);}} 42 cc ask(int x) 43 { 44 cc ans={0,0}; 45 while(x<=n) 46 { 47 if(C[x].maxn==ans.maxn)ans.num+=C[x].num; 48 else if(C[x].maxn>ans.maxn)ans.maxn=C[x].maxn,ans.num=C[x].num; 49 x+=lowbit(x); 50 } 51 return ans; 52 } 53 cc C2[MAXN]; 54 void add2(int x,double y,double nu) 55 { 56 while(x<=n) 57 { 58 if(C2[x].maxn==y)C2[x].num+=nu; 59 else if(C2[x].maxn<y)C2[x].maxn=y,C2[x].num=nu; 60 x+=lowbit(x); 61 } 62 } 63 void admin2(int x) 64 {while(x<=n){C2[x].maxn=C2[x].num=0;x+=lowbit(x);}} 65 cc ask2(int x) 66 { 67 cc ans={0,0}; 68 while(x) 69 { 70 if(C2[x].maxn==ans.maxn)ans.num+=C2[x].num; 71 else if(C2[x].maxn>ans.maxn)ans.maxn=C2[x].maxn,ans.num=C2[x].num; 72 x-=lowbit(x); 73 } 74 return ans; 75 } 76 void CDQ(int l,int r) 77 { 78 if(l==r){return;} 79 int mid=(l+r)>>1; 80 CDQ(l,mid); 81 sort(a+l,a+mid+1,cmp2); 82 sort(a+mid+1,a+r+1,cmp2); 83 int j=l; 84 for(int i=mid+1;i<=r;i++) 85 { 86 while(j<=mid&&h(j)>=h(i)) 87 { 88 add(v(j),f(j),g(j));j++; 89 } 90 cc tem=ask(v(i));tem.maxn++; 91 if(tem.maxn==f(i))g(i)+=tem.num; 92 else if(tem.maxn>f(i))f(i)=tem.maxn,g(i)=tem.num; 93 } 94 for(int i=l;i<j;i++)admin(v(i)); 95 sort(a+mid+1,a+r+1,cmp1); 96 CDQ(mid+1,r); 97 } 98 void CDQ2(int l,int r) 99 { 100 if(l==r){return;} 101 int mid=(l+r)>>1; 102 CDQ2(l,mid); 103 sort(a+l,a+mid+1,cmp4); 104 sort(a+mid+1,a+r+1,cmp4); 105 int j=l; 106 for(int i=mid+1;i<=r;i++) 107 { 108 while(j<=mid&&h(j)<=h(i)) 109 { 110 add2(v(j),he(j),s(j));j++; 111 } 112 cc tem=ask2(v(i));tem.maxn++; 113 if(tem.maxn==he(i))s(i)+=tem.num; 114 else if(tem.maxn>he(i))he(i)=tem.maxn,s(i)=tem.num; 115 } 116 for(int i=l;i<j;i++)admin2(v(i)); 117 sort(a+mid+1,a+r+1,cmp3); 118 CDQ2(mid+1,r); 119 } 120 signed main() 121 { 122 // freopen("1.in","r",stdin); 123 // freopen("out.out","w",stdout); 124 125 cin>>n; 126 for(int i=1;i<=n;i++) 127 cin>>h(i)>>v(i),t(i)=i,th[i]=h(i),tv[i]=v(i); 128 sort(th+1,th+n+1); 129 sort(tv+1,tv+n+1); 130 int len1=unique(th+1,th+n+1)-th-1; 131 int len2=unique(tv+1,tv+n+1)-tv-1; 132 for(int i=1;i<=n;i++) 133 h(i)=lower_bound(th+1,th+len1+1,h(i))-th, 134 v(i)=lower_bound(tv+1,tv+len2+1,v(i))-tv; 135 for(int i=1;i<=n;i++)f(i)=g(i)=he(i)=s(i)=1; 136 sort(a+1,a+n+1,cmp1); 137 CDQ(1,n); 138 for(int i=1;i<=n;i++)ans=max(ans,f(i)); 139 printf("%0.0lf\n",ans); 140 sort(a+1,a+n+1,cmp3); 141 CDQ2(1,n); 142 double summ=0; 143 sort(a+1,a+n+1,cmp1); 144 for(int i=1;i<=n;i++) 145 if(fabs(f(i)-ans)<=1e-8) summ+=g(i); 146 for(int i=1;i<=n;i++) 147 { 148 if(f(i)+he(i)-1==ans){double ttt=(double)(1.0*g(i)*s(i))/summ;printf("%0.5lf ",ttt);} 149 else printf("0.00000 "); 150 }puts(""); 151 } View Code

?

?

?

轉載于:https://www.cnblogs.com/Al-Ca/p/11291339.html

總結

以上是生活随笔為你收集整理的BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日韩xxx高潮hd | 深夜在线免费视频 | 亚洲 欧美 日韩系列 | 欧美九九 | 久久99精品久久久久久水蜜桃 | 欧美理论片在线观看 | 禁漫天堂下载18 | 蜜臀av一区 | 内射干少妇亚洲69xxx | 欧美激情自拍偷拍 | 亚洲青春草| 国产精品一区二区三区免费视频 | 伊人网国产 | 人妻少妇精品中文字幕av蜜桃 | 狠狠插视频 | 娇妻玩4p被三个男人伺候电影 | 欧美亚洲第一区 | 麻豆午夜 | 国产精品一线天粉嫩av | 日日燥夜夜燥 | 九一亚色 | 96超碰在线 | 大吊一区二区三区 | 成人免费直播 | 女性喷水视频 | 日韩精品二区在线观看 | 国产chinasex麻豆videos | 国产人免费人成免费视频 | 成人a毛片久久免费播放 | 四级毛片 | 乱一色一乱一性一视频 | 香蕉婷婷| 美女露隐私网站 | 国产a√精品区二区三区四区 | 亚洲福利社 | 国产色av | 国产女教师一区二区三区 | 六月丁香啪啪 | 黄色一级视频在线观看 | 中国黄色网址 | 久久久久久久久久久久国产精品 | 国产高清一区在线 | 不卡的一区二区 | 91夫妻在线| 我爱我色成人网 | 51av视频| 99精品视频免费 | 中文字幕日韩在线视频 | 91成人免费电影 | 九九精品免费视频 | 亚洲精品乱码久久久久久久 | 久久狠 | 女同毛片一区二区三区 | 国产乱子伦精品视频 | 日韩视频一区二区三区在线播放免费观看 | 偷拍久久久 | 亚洲国产精品久久久久久久 | 捆绑调教sm束缚网站 | 免费欧美一区 | 女同性αv亚洲女同志 | 亚洲图片一区二区三区 | 99热在线这里只有精品 | 国产黄色片视频 | 天堂少妇 | 国产精品久久久久久久久 | 亚洲国产精品电影 | 色小姐在线视频 | 野外一级片 | 99久久人妻无码精品系列 | 激情黄色小视频 | 亚洲一品道 | 私人毛片 | 亚洲视频1 | 天天想你在线观看完整版电影免费 | 国产精品无码无卡无需播放器 | 欧美少妇毛茸茸 | 亚洲欧美日韩综合在线 | 91精品国产入口 | 日本国产一区二区 | 欧美精品一区二区三 | 亚洲区成人 | 最新中文av | 青青草狠狠干 | 性一交一乱一精一晶 | 国产在线一区二区 | 国产又黄又爽 | 自拍第一页 | 极品少妇一区二区 | 亚洲区小说区图片区 | 国产精品夜夜嗨 | 涩涩涩涩涩涩涩涩涩涩 | 嫩草亚洲 | 伊人青青草原 | 精品国产午夜 | 日韩av中文在线 | 亚洲AV成人精品 | 日本涩涩网站 | 少妇极品熟妇人妻无码 | 亚洲视频在线免费 |