哎呀。。。最近是真的懶,好久沒有寫過部落格了。既然快開學了,那麼今天就寫一寫部落格吧(??什麼鬼邏輯)
題目描述:
在比賽賽後男神丁給大家提出了乙個問題,現在,你只知道俱樂部中最高的人的身高是h,在位置p上,並且給出你們n對關係,(a,b)表示a、b位置上的人可以互相看見(當且僅當他們中間的人都比他們矮時才能互相看到),求**上每個人的最大身高可能是多少。
輸入格式:
第一行輸入整數n,p,h,m
接下來m行,每行兩個整數 a 和 b ,代表位置a和位置b上的人可以互相看見
輸出格式:
一共輸出 n行資料,每行輸出乙個整數。
第 i 行輸出的整數代表第 i 個位置上的人可能的最大身高是多少。
輸入樣例:
9 3 5 5輸出樣例:1 35 3
4 33 7
9 8
545說明:3445
55
1≤n≤10000,
1≤h≤1000000,
1≤a,b≤10000,
0≤m≤100000
思路:
方法一:模擬(資料較小的時候用)
看到這個題的時候。。。第乙個反應是先拿了草稿紙和筆把樣例是怎麼出來的給推導了一遍,一開始毫無頭緒,後來看了幾分鐘自己畫的草圖就忽然發現就是區域內進行減法的問題emmmm
具體是這樣的:先把所有位置的身高都假設為最高身高,然後由題意可以知道在每一對關係的(也就是a,b)兩個位置中間的人的身高是一定要小於兩個端點的身高的(要不然不可能兩個端點會互相看見),也就是每次出現這個區間就要對區間內的位置的身高進行-1。
為什麼會-1呢?因為如果在區間內假如有乙個點的身高是大於等於a的,那麼也就意味著這個位置的人必定作為過一次a位置,如果他減的話,和他相關的都要減。
p.s 由於是o(n^2)的演算法,所以資料要是大的話會tle的,萬幸出題的學姐忘記把卡模擬方法的大資料放上去了。。。所以很快就a了
方法二:差分(字首和)
其實具體的想法跟第一種是差不多的,但是由於在時間複雜度上是乙個常數,所以適用於更大的資料。
具體就是另開乙個陣列記錄一下變化值,最後兩個陣列的相同位置的相加就可以了。但是這裡用到了stl的set,所以就相當於只開了乙個陣列。(stl還是很方便的)
一定要記得去重!!!!
**如下:
模擬
#include//鬼知道是貪心是模擬t^t
using namespace std;
int main()
for(int j = x + 1;j < y ;j++) //控制區間內
if(a[j] >= a[k]) //區間的身高一定小於兩個端點的身高
}for(int i = 1;i < n + 1 ;i++)
printf("%d\n",a[i]);
return 0;
}//希望不重**orz,給您跪了。。為什麼從i= 1開始是個玄學的問題
差分(stl)
#includeusing namespace std;
setf[10010];
int n,m,h,p,s[10010],temp;
int main()
if(!f[a].count(b))
}for(int i=1;i<=n;i++)
printf("%d\n",s[i]+=s[i-1]);
return 0;
}
wa的一聲哭出來!!!俱樂部裡的dalao欺負萌新,場面已經控制不住了(哭唧唧~) 洛谷 3128 樹上差分
這道題由於只是在最後詢問,因此我們可以利用一種叫做差分的技巧,具體來說,就是如果要修改u到v的路徑,我們可以將sum u sum v sum lca u,v sum father lca u,v 這樣我們可以通過一遍dfs自底向上轉移sum值,這樣就能最後在o n 的時間內求出每個點的值。inclu...
T69747 合影 差分
題目背景 程式設計俱樂部即將參加程式設計大賽,在參加之前,男神丁建議大家一起合乙個影。題目描述 在比賽賽後男神丁給大家提出了乙個問題,現在,你只知道俱樂部中最高的人的身高是h,在位置p上,並且給出你們n對關係,a,b 表示a b位置上的人可以互相看見 當且僅當他們中間的人都比他們矮時才能互相看到 求...
洛谷OJ記錄
記錄一哈刷洛谷的一些技巧和函式 萬能標頭檔案 include 它幾乎包含了你能用到的所有標頭檔案。include include include include include include include include include include include include inclu...