中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

洛谷 P11104 [ROI 2023] 監控(kong) (Day 1) 題解

題(ti)目描(miao)述的很清晰,圖都配了,就(jiu)不(bu)贅述題(ti)面了。

思路分析

問題一:求最小緊湊性

首先可以(yi)很容易發(fa)現,緊湊性便是以(yi)橫坐標最(zui)(zui)大和最(zui)(zui)小的(de)兩(liang)個(ge)攝(she)像(xiang)(xiang)頭畫面(mian)的(de)橫軸距(ju)離為長、以(yi)縱坐標最(zui)(zui)小和最(zui)(zui)大的(de)兩(liang)個(ge)攝(she)像(xiang)(xiang)頭畫面(mian)的(de)縱軸距(ju)離為寬的(de)矩形面(mian)積,所以(yi)我們只需(xu)要讓兩(liang)者(zhe)盡可能小就行了(le)。

顯然,左右(you)的(de)移(yi)動和上下移(yi)動的(de)這兩(liang)類操作(zuo)對于最(zui)終答案的(de)貢獻是分開的(de),兩(liang)者(zhe)不會互(hu)相干擾。以題目第二組(zu)樣例為(wei)例,如圖,藍色部分即為(wei)攝像頭(tou)畫面:

對于此時的圖像畫面而言,緊湊性為 \(4\times3=12\)

執(zhi)行(xing)右移操(cao)作,則(ze)畫面變(bian)更為:

緊湊性變為 \(2\times3=6\)

對于以上左移操(cao)作,出現(xian)變化的只有橫坐標(biao)最大和最小的兩個攝(she)像頭畫面的橫軸距(ju)離,而(er)縱向(xiang)(xiang)并(bing)沒有受(shou)到(dao)左移操(cao)作的影響(xiang)。同(tong)理,上下(xia)移動操(cao)作也(ye)不(bu)會影響(xiang)到(dao)橫向(xiang)(xiang),所以我們可以放心大膽地(di)把橫向(xiang)(xiang)和縱向(xiang)(xiang)分開討論。

仍(reng)以(yi)題目第二組(zu)樣例(li)為例(li):

先來看橫向的。既然我們要求的是橫坐標最大和最小的兩個攝像頭畫面的橫軸距離,那我們不妨先給所有橫坐標進行排序,我們便得到了這么一個序列 \(a\)

對(dui)應到圖中,則變成了這樣:

(tips:重(zhong)復的(de)元素其實(shi)無所謂,實(shi)際代碼中去(qu)不(bu)去(qu)重(zhong)不(bu)影(ying)響判斷)

設最終答案的橫長為 \(X\) ,不難發現,當且僅當有元素從一個端點移動到另一個端點時 \(X\) 才會發生變化,其余步驟移動均不會改變 \(X\) 的值。

而從一個端點移動到另一個端點這一步驟,我們既能通過左移來實現,也能通過右移來實現。具體地,如下圖,如果我想把左邊的畫面移動到最右邊,既可以通過左移一步來達成,也可以通過右移三步來達成,而其他的畫面的位置會跟隨其一并發生變化,移動的方式最終不會影響到 \(X\) 的值。

所以先拋開右移操作,僅考慮左移:發生左右端點間的移動,便是把 \(a\) 中的值最小的點的值變化為 \(h\) ,其余的點的值則減去最小值。由于我們已經給 \(a\) 排好序了,所以其中的最小值便是 \(a_1\) 了,經過左移到左端點后再進行一次左移的操作后,序列 \(a\) 就會變(bian)成 $ h,a_2 - a_1 ,\cdots, a_k - a_1$ 。我(wo)們再對其排一次(ci)序,得到(dao) $ a_2 - a_1 ,\cdots, a_k - a_1,h$

此時,我們再代入求 \(X\) 的公式,便會得到 \(X=h-(a_2-a_1)+1\)。而如果把現在的序列 \(a\) 再進行一次將最小值移動到右端點的操作,我們又能得到一個新的 \(X\) 。可以發現,一共存在 \(K\) 種可能的 \(X\) ,推到以下可得:\(X_i=h-(a_i-a_{i-1})+1\ (\ 1 < i \leq k)\) 其中,\(X_i\) 表示以原數組 \(a\) 的第 \(i\) 個數作為最小值\(X\) 的值。

帶入到樣例中,我們能得到如下圖所示的序列 \(X\)

欸?那 \(X_1\) 怎么辦呢?我們只需要在最開始給 \(a\) 排好序的時候直接 \(a_k-a_1+1\) 就好啦,因為 \(a_1\) 本來就是這么多節點(dian)橫坐(zuo)標(biao)的最小值嘛:

于是這樣,我們就得到了所有可能的 \(X\)

相信這時候就有聰明的同學會想到,題目要求的明明是最小值的緊湊性,那我直接維護最小的 \(X\) 不就行了嗎?費這個空間把所有 \(X\) 存下來干嘛?

沒錯,我們在枚舉所有的 \(X\) 時僅(jin)需要(yao)(yao)維護最小的(de)那個就可(ke)以(yi)了,沒(mei)必要(yao)(yao)保留其他那些(xie)沒(mei)什么用處的(de)數(shu)據:

縱向上同理,設最終答案的縱長為 \(Y\) ,同相同的方法挨個枚舉可能的 \(Y\) 并記(ji)錄最小(xiao)值就行。這樣(yang)我(wo)們就解決了第一個問題。

問題二:達成最小緊湊性時的步數

別忘了題目還(huan)有(you)一(yi)個問題呢!

前面我們在求最小緊湊性的時候,已經鎖定了最小的 \(X\)\(Y\) 的值,并且在枚舉兩者的時候找到了它們對應的點的坐標位置,那我們不妨在枚舉的同時再額外考慮一下如何到達這個問題。

依(yi)舊以樣(yang)例二、橫向操作為(wei)例:

前文提到,“ 從一個端點移動到另一個端點這一步驟,我們既能通過左移來實現,也能通過右移來實現 ”,具體地,想讓數組 \(a\) 中的最小值成為最大(da)值,可(ke)以通過將其左移(yi)到左界并再(zai)次左移(yi),或者是將其一直右移(yi)直至右界:

(素材復用)

但僅僅只有這兩種方(fang)法了嗎?并不(bu)一定(ding)。

仔細思考可以發現,對于每個 \(X_i\) ,枚舉時我們的目的僅僅只是讓最左端點移動成為數組 \(a\) 中的最大值,而不一定是讓它成為右界 \(h\)

樣例二并不能很好地體現(xian)這一(yi)(yi)點,我們換一(yi)(yi)張(zhang)圖:

顯然,我們在考慮最左邊的 \(a_1\) 右移成為最大值時,其實只需要右移兩次、把 \(a_2\) 右移超過右界來到左界就可以了,并不需要把 \(a_1\) 移動到最右端:

所以 讓最左端點移動成為數組 \(a\) 中的最大值 這個問題也可以轉變為 讓最左端點右側的第一個端點移動成為數組 \(a\) 中的最小值

面對轉換后的問題,最簡單的方式不就是把 \(a_2\) 這(zhe)(zhe)家伙給弄到左端點(dian)的(de)位(wei)置上去嗎?而(er)這(zhe)(zhe)又有(you)了左移(yi)和(he)右移(yi)兩種方(fang)法(fa)。

于是,我們可以得到,對于每個 \(X_i\) ,最簡單(dan)地(di)達成它一(yi)共(gong)有四(si)種(zhong)方式,即四(si)種(zhong)移動步驟(zou):

1.將 \(a_{i-1}\) 左移至左端點的位置再左移一次,步數: \(a_{i-1}\)

2.將 \(a_{i-1}\) 右移至右端點的位置,步數: \(h-a_{i-1}\)

3.將 \(a_i\) 左移至左端點的位置,步數: \(a_i-1\)

4.將 \(a_i\) 右移至右端點的位置再右移一次,步數: \(h-a_i+1\)

由于題目需要的是最小步數,所以我們就取這四個值里頭最小的那個作為 \(X_i\) 對應的步(bu)數(shu)就可以(yi)啦!

縱向也是一個道理,最后輸出答案的時候輸出最小的 \(X\) 和最小的 \(Y\) 相(xiang)乘的結果(guo)和他們對應的最小(xiao)步數相(xiang)加就(jiu)完工啦!

恭喜你切了這道題!

最后,進點食:

十(shi)年OI________,不開________見(jian)祖(zu)宗!

Code

#include<bits/stdc++.h>
using namespace std;
const int MAXK=1e5+5;
#define int long long
int h,w,k,x[MAXK],y[MAXK];      //x[]對應橫坐標,即文中的a,y[]對應縱坐標
int min_x,min_y,min_stepx=0,min_stepy=0;    //min_x、min_y分別是最小的X和最小的Y;min_stepx和min_stepy則分別對應X和Y最小時的步數
signed main()
{
	cin>>h>>w>>k;
	for(int i=1;i<=k;i++)
		cin>>x[i]>>y[i];
	if(k==1)                //這里加了個特判,因為就一個點的時候答案是一定的,再跑一遍程序浪費時間,其實加不加無所謂
	{
		cout<<"1 0";
		return 0;
	}
	sort(x+1,x+1+k);
	sort(y+1,y+1+k);
	min_x=x[k]-x[1]+1;
	min_y=y[k]-y[1]+1;
	for(int i=1;i<=k;i++)
	{
		if(min_x==(h-(x[i]-x[i-1])+1))
			min_stepx=min(min_stepx,min(x[i-1],min(h-x[i-1],min((x[i]-1),(h-x[i]+1)))));
		else
		{
			min_x=min(min_x,(h-(x[i]-x[i-1])+1));
			if(min_x==(h-(x[i]-x[i-1])+1))
				min_stepx=min(x[i-1],min(h-x[i-1],min((x[i]-1),(h-x[i]+1))));
		}
		if(min_y==(w-(y[i]-y[i-1])+1))
			min_stepy=min(min_stepy,min(y[i-1],min(w-y[i-1],min((y[i]-1),(w-y[i]+1)))));
		else
		{
			min_y=min(min_y,(w-(y[i]-y[i-1])+1));
			if(min_y==(w-(y[i]-y[i-1])+1))
				min_stepy=min(y[i-1],min(w-y[i-1],min((y[i]-1),(w-y[i]+1))));
		}
	}
	cout<<(min_x*min_y)<<" "<<(min_stepx+min_stepy);
	return 0;
}
posted @ 2025-10-29 18:44  Kaos·Abraham  閱讀(60)  評論(0)    收藏  舉報