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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【NOIP模拟】健美猫

發(fā)布時間:2024/7/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NOIP模拟】健美猫 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題面

分析

此題真是一言難盡。下面這么大一串,真的只是在講一個小模擬。。。此題也是被幾個julao反復(fù)講,各種五花八門的奇淫巧技,什么數(shù)學(xué)變形,樹狀數(shù)組,差分,單調(diào)……好吧,我是那種只會30分暴力的人,也沒理由嫌棄這些我聽不懂的做法。

于是看到了一篇極其妙的題解,思路是建坐標(biāo)系,然而這位julao的題解的code跑出來只有30pts。借用大佬的圖
首先,以i為橫坐標(biāo),ai為縱坐標(biāo),建立平面直角坐標(biāo)系,將點(diǎn)全部描在坐標(biāo)系里,并畫出y=x的直線,可以發(fā)現(xiàn),點(diǎn)到直線的豎直距離
之和,就是我們要求的答案。

然而怎么求不同順序的答案呢?

只需要左右平移這條直線!
可以發(fā)現(xiàn),向左平移,在這條直線上方的點(diǎn),到直線的豎直距離會減小1,而在這條直線下方或處于直線上的點(diǎn),到直線的豎直距離會?加1。

如果是向右平移,顯然是恰好相反,所以要枚舉所有情況,只需要將這條直線向一個方向,平移n次,每次平移一個單位。
然而有一個特殊的點(diǎn),n->1
假如選擇向左平移,1~n-1個點(diǎn)的值的計算方式完全不變。
但是第n個點(diǎn)會變,所以每次平移特殊處理第n個點(diǎn)。


其實你或許已經(jīng)發(fā)現(xiàn)了,圖象是答案的幾何含義,本質(zhì)上我們的平移操作等效于在序列上移動下標(biāo)。
到這里,大體思路就已經(jīng)出現(xiàn)了,但是我覺得細(xì)節(jié)也是比較難懂的(或許是我太菜了),所以我再稍微補(bǔ)充一下。

1.怎么維護(hù)每次移動后的直線上下方的點(diǎn)呢?用up,down記錄在直線上方下方的點(diǎn)的個數(shù)。先預(yù)處理點(diǎn)對于初始直線的上下方個數(shù)。再維?護(hù)一個d[ ]數(shù)組,每出現(xiàn)一個處于直線上方的點(diǎn),就將這個 d[s]++(s為這個點(diǎn)到直線的豎直距離)。這 表示在直線上方的距離處s處,有d[s]個 點(diǎn),由初中數(shù)學(xué)知識易證,y=x向左平移1單位等價于向上平移1單位。所以當(dāng)我們一共平移了i個單位后,我們就需要利用d[i]來更?新在直線上方的點(diǎn),顯然,在直線上方的點(diǎn)的數(shù)量up-=d[i],因為本來離初始直線距離為i的點(diǎn),在直線經(jīng)過i個單位的平移后,已經(jīng)落在?了直線上,而不再在直線上方。相應(yīng)地down+=d[i]

2.因為ai<=n的,所以第n個點(diǎn)本來一定是屬于down集的,現(xiàn)在相當(dāng)于它移到了第一個位置,只要比1大的,就可從down集出來進(jìn)入up集。
3.計算答案的時候是tmp+=down-up根據(jù)2中所述,最后一個點(diǎn)顯然屬于down集,所以它已經(jīng)被算成了,對答案的貢獻(xiàn)加一,所以真正的更新方式應(yīng)是tmp+=down-up-1.
溫馨提示:1.longlong
2.數(shù)組開四倍。我掛了半天,最后瞎搞胡亂改錯然后過了。01 dalao給我指點(diǎn)了一下,因為按照序列的理論上來說,d的偏移量是2n,而這又是個環(huán),所以是4n空間。

?代碼

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 4000100 #define ll long long ll a[N],d[N]; ll n,ans,tmp,up,down; int main() {scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);if(a[i]>i)tmp+=a[i]-i,up++,d[a[i]-i]++;else tmp+=i-a[i],down++;} ans=tmp;for(int i=1;i<=n;i++){tmp+=down-up-1;tmp-=n-a[n-i+1],tmp+=a[n-i+1]-1;if(a[n-i+1]>1)up++,down--,d[i+a[n-i+1]-1]++;down+=d[i],up-=d[i];ans=min(ans,tmp); }printf("%lld\n",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/NSD-email0820/p/9735072.html

總結(jié)

以上是生活随笔為你收集整理的【NOIP模拟】健美猫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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