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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSAcademy Or Problem

發(fā)布時(shí)間:2023/12/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSAcademy Or Problem 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門

一口大鍋(

斜率的確是有單調(diào)性 并且可以進(jìn)行凸優(yōu)化的 明明是證出來的 為什么自己就不相信呢(


我們發(fā)現(xiàn)對(duì)于當(dāng)前點(diǎn)作為擴(kuò)展的右端點(diǎn) 那么他前面至多有20個(gè)點(diǎn)會(huì)影響到這一段區(qū)間的或值 我們可以預(yù)處理記錄出來這些節(jié)點(diǎn)的位置 很明顯 答案隨著右端點(diǎn)越向右是非嚴(yán)格遞增的 所以直接取最右端的節(jié)點(diǎn)即可

我們列出方程?狀態(tài)是nk轉(zhuǎn)移log 顯然可以進(jìn)行凸優(yōu)化

因?yàn)榇鸢鸽S著段數(shù)增加非嚴(yán)格遞增 分析一波段數(shù)少的可以記錄答案就結(jié)束啦

?

有關(guān)于單調(diào)性的證明如下。

我們可以將原始的問題轉(zhuǎn)化成 我們每次選擇兩個(gè)位置進(jìn)行合并 代價(jià)為這兩段的&

我們需要進(jìn)行n-k次合并 并且要最小化&

這個(gè)顯然是有單調(diào)性的 因?yàn)?我們少合并一次就可以減少代價(jià) 并且這個(gè)代價(jià)必定是單調(diào)的 因?yàn)?最開始的&只是小段的& 隨著合并的段數(shù)長度增加 這一段的或值顯然是非嚴(yán)格遞增的 那么&的值顯然也是非嚴(yán)格遞增的

這樣的話就證完了。

?

一個(gè)小問題 : log運(yùn)算非常慢( 會(huì)因?yàn)檫@玩意T掉 所以那nlg個(gè)區(qū)間或值預(yù)處理出來比較好

附代碼。

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 2002122500 #define ll long long using namespace std;int a[100010],p[100010][21],fr[21],l[21],lg[100010]; ll f[100010],tot;int qaq[100010][21];int g[100010]; int n,k; struct ST {int f[100010][18];void build(){for(int i=1;i<=n;i++) f[i][0]=a[i];for(int i=1;i<18;i++)for(int j=1;j+(1<<i-1)<=n;j++)f[j][i]=f[j][i-1]|f[j+(1<<i-1)][i-1];}int query(int l,int r){int k=lg[r-l+1];return f[l][k]|f[r-(1<<k)+1][k];} }st;void find(int x) {p[x][0]=x;qaq[x][0]=a[x];int cnt=0;for(int i=0;i<=20;i++)if((!(a[x]&(1<<i)))&&fr[i]) p[x][++cnt]=fr[i],qaq[x][cnt]=st.query(fr[i],x);p[x][++cnt]=1;qaq[x][cnt]=st.query(1,x); } bool check(int mid) {for(int i=1;i<=n;i++) f[i]=-inf,g[i]=inf;for(int i=1;i<=n;i++){for(int j=0;j<=20&&p[i][j];j++){//printf("%d %d %d\n",i,j,p[i][j]);ll tmp=qaq[i][j]+mid+f[p[i][j]-1];if(tmp>f[i]||(tmp==f[i] && g[p[i][j]-1] +1 <g[i]))g[i]=g[p[i][j]-1]+1,f[i]=tmp;}}//printf("%d %d %d\n",f[n],g[n],mid);return g[n]<=k; } int main() {//freopen("orSimple.in","r",stdin);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&a[i]),tot+=a[i];st.build();l[0]=1;int i;for(i=1;i<18;i++){l[i]=(1<<i);//printf("%d %d\n",i,l[i]);if(l[i]>=n) break;for(int j=l[i-1];j<l[i];j++) lg[j]=i-1;}for(int j=l[i-1];j<=n;j++) lg[j]=i-1;int l,r;for(int i=1;i<=n;i++){find(i);for(int j=0;j<=20;j++)if(a[i]&(1<<j)) fr[j]=i;}l=-inf;r=0;ll ans;while(l<=r){int mid=(l+r)>>1;if(check(mid)) l=mid+1,ans=f[n]-(ll)mid*k;else r=mid-1;}printf("%lld\n",ans);return 0; } /** 21 9 3 4 1 4 8 10 9 38 83 3 28 4 2 1 14 41 31 41 39 5 2 */

?

轉(zhuǎn)載于:https://www.cnblogs.com/hanyuweining/p/10321914.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的CSAcademy Or Problem的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。