NOIP模擬 健美貓

2022-05-12 05:13:27 字數 1495 閱讀 4928

此題真是一言難盡。下面這麼大一串,真的只是在講乙個小模擬。。。此題也是被幾個julao反覆講,各種五花八門的奇淫巧技,什麼數學變形,樹狀陣列,差分,單調……好吧,我是那種只會30分暴力的人,也沒理由嫌棄這些我聽不懂的做法。

於是看到了一篇極其妙的題解,思路是建座標系,然而這位julao的題解的code跑出來只有30pts。借用大佬的圖

首先,以i為橫座標,ai為縱座標,建立平面直角座標系,將點全部描在座標系裡,並畫出y=x的直線,可以發現,點到直線的豎直距離

之和,就是我們要求的答案。

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

只需要左右平移這條直線!

可以發現,向左平移,在這條直線上方的點,到直線的豎直距離會減小1,而在這條直線下方或處於直線上的點,到直線的豎直距離會 加1。

如果是向右平移,顯然是恰好相反,所以要列舉所有情況,只需要將這條直線向乙個方向,平移n次,每次平移乙個單位。

然而有乙個特殊的點,n->1

假如選擇向左平移,1~n-1個點的值的計算方式完全不變。

但是第n個點會變,所以每次平移特殊處理第n個點。

其實你或許已經發現了,圖象是答案的幾何含義,本質上我們的平移操作等效於在序列上移動下標。

到這裡,大體思路就已經出現了,但是我覺得細節也是比較難懂的(或許是我太菜了),所以我再稍微補充一下。

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

#include#include

#include

#include

using

namespace

std;

#define n 4000100

#define ll long longll a[n],d[n];

ll n,ans,tmp,up,down;

intmain()

ans=tmp;

for(int i=1;i<=n;i++)

printf(

"%lld\n

",ans);

return0;

}

NOIP模擬 修路

這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...

NOIP模擬 項鍊

經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...

NOIP模擬 幻象

phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...