SCOI2009 生日禮物 雙指標

2021-10-09 04:50:00 字數 1583 閱讀 4905

題意:

小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標(即位置)。某些座標上可以沒有彩珠,但多個彩珠也可以出現在同乙個位置上。 小布生日快到了,於是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮,小西希望這一段彩帶中能包含所有種類的彩珠。同時,為了方便,小西希望這段彩帶盡可能短,你能幫助小西計算這個最短的長度麼?彩帶的長度即為彩帶開始位置到結束位置的位置差。

題解:

雙指標。

利用stl裡面的pair容器,預設排序的性質,就可以不需要自己寫乙個自定義函式了。

因為寶石的種類很少,當我們每取一段範圍時,我們暴力判斷以下這個區間是否滿足。

時間複雜度 o(nlogn+n*60) ?

雙指標判斷條件

如果這段區間的寶石滿足 題目要求

那麼我們r++,同時加上此位置的寶石數目。

如果滿足了我們就l++,同時減去那個位置的寶石數目。

這裡的區間5-8的區間長度是3,不是4 ,注意一下即可.

**:

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#define int long long

using

namespace std;

const

int maxn =

100;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const ll mod=

1e9+7;

vector int,

int>

> v;

int visited[

100]

;int n,k;

bool

check()

return

true;}

signed

main()

}sort

(v.begin()

,v.end()

);int l=

0,r=0;

int ans=maxn;

//for(auto it:v) cout.second]++;

while

(relse

} cout

}

SCOI2009 生日禮物

傳送門 本來想用二分的,讀完資料之後,又發現不用了。然而需要開多乙個陣列p pp記錄顏色最近出現的位置,以便進行玄學操作 當達成目標 now en dnow end now e nd 時,if now end while l.col a l p l 因為a l co la l col a l c o...

1293 SCOI2009 生日禮物

題目鏈結 題目大意 數軸上有若干個彩色的點,求最短區間,使其包含所有顏色的點至少乙個 題解 做法挺多的,例如說堆,二分 我寫的大概是乙個叫尺取法的東西,就是維護兩個指標,表示區間的兩個端點,然後移動 感覺跟莫隊的維護方法差不多 我的收穫 get include include include usi...

1293 SCOI2009 生日禮物

time limit 10 sec memory limit 162 mb submit 3151 solved 1743 submit status discuss 小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標...