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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NOIP模拟测试8「寿司」

發布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NOIP模拟测试8「寿司」 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

考試時打的類似$n^2$暴力,然后炸了只有10分

后來驗證我的算法偽了。

題解


?

顯然你有一種解法,假設你要在一個B點斷開將R分別移向最左 最右,這樣只用分別計算B點右面藍色數量左面藍色數量就得到了一個ans

這個題有一個很不顯然的結論,假設你要將R移向兩邊時,序列唯一確定時,設pos=(藍色數量+1)/2,在pos點將R移向左面,右面花費最小(單調性)

因為這個序列是循環的所以我們只要枚舉B點斷開的位置就可以$n^2$求出最小的ans值

$n^2$顯然過不了1000000

現在我們思考$n^2$問題在哪,首先你每次重新計算一次ans額外花費了時間,然后每次都枚舉斷點又花費了時間

但實際上我們每次循環到下一個這個序列實際上變化很少,只是前面那個字母刪去,后面再加一個字母

實際對ans改變也很少

類似于莫隊,對于ans+ - 我們可以得到另一個ans

那么我們可以計算出他的改變

首先我們可以得出每次循環到下一B,假設我們目前斷點不變,那么所有左邊R對ans造成貢獻都會減1,所有右邊R對ans造成貢獻都會加1

然后我們思考下一個斷點,假設當前斷點顯然就是下一個B

然后我們斷點移動過程中我們發現有一些R從右面移動到了左面,那么他要移動貢獻也從右面blue數量改成了右面貢獻,減去左面貢獻加上左面的貢獻即可

代碼


?

#include<bits/stdc++.h> #define ll long long #define A 2100000 using namespace std; ll t,len,n,ans,pos,zo,p; ll lb[A],rb[A],lr[A],rr[A]; char c[A]; int main() { // freopen("mkd.txt","r",stdin); // freopen("wa.txt","w",stdout);scanf("%lld",&t);while(t--){ans=0;zo=ans;lb[0]=rb[0]=lr[0]=rr[0]=0;scanf("%s",c+1);len=strlen(c+1);n=len;pos=-1;for(ll i=1;i<=len;i++){c[n+i]=c[i];}len*=2;rr[len+1]=rb[len+1]=0;for(ll i=1;i<=len;i++){lb[i]=lb[i-1],lr[i]=lr[i-1];if(c[i]=='B')lb[i]++;else lr[i]++;}for(ll i=len;i>=1;i--){rr[i]=rr[i+1],rb[i]=rb[i+1];if(c[i]=='B') rb[i]++;else rr[i]++;}pos=(lb[n]+1)/2; // printf("pos=%lld\n",pos);for(ll i=1;i<=n;i++){if(lb[i]==pos){p=i;for(ll j=n;j>i;j--){if(c[j]=='R')ans+=rb[j]-rb[n+1]; // printf("rr=%lld rr[n]=%lld\n",rr[j],rr[n+1]); }break;}else if(c[i]=='R')ans+=lb[i];} // printf("ans=%lld\n",ans);zo=ans;ll head=1,tail=n;while(head<=n){if(c[head]=='B'){ ans-=lr[p]-lr[head-1];//如果當前為B將B向后移動那么左邊所有R代價-1ans+=rr[p]-rr[tail+1];//如果當前為B將B向后移動那么右邊所有R代價+1while(c[++p]!='B'){//當前指針應當指向下一個Bans+=lb[p]-lb[head];//如果R由左變為了右,那么代價從左邊變成右邊ans-=rb[p]-rb[tail+2];}}head++,tail++;zo=min(zo,ans);}cout<<zo<<endl;} } View Code

?

轉載于:https://www.cnblogs.com/znsbc-13/p/11247211.html

總結

以上是生活随笔為你收集整理的NOIP模拟测试8「寿司」的全部內容,希望文章能夠幫你解決所遇到的問題。

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